自定义控件使用DataSourceId

自定义控件使用DataSourceId

问题描述:

我正在尝试编写自定义控件。我想让它的用户指定一个DataSourceId(很像GridView,Repeater等)。自定义控件使用DataSourceId

我可以找到对应于该id的数据源。我可以得到关联的DataSourceView。但是,获取数据的唯一方法似乎是采用异步选择方法。当然,我可以设置回调,使我的代码阻塞,直到回调发生。但是这需要很多怪异的旋转,所以我怀疑我做错了什么。

如果我想让一个控件像其他一些ASP.NET数据控件一样工作,我应该做些什么改变?

这里有点我写:

string dataSourceId = "SomeDataSourceForTesting"; 
    protected override void RenderContents(HtmlTextWriter writer) 
    { 
     IDataSource ds = (IDataSource)Parent.FindControl(dataSourceId); 
     List<string> viewNames = new List<string>(); 
     foreach(string name in ds.GetViewNames()) 
     { 
      viewNames.Add(name); 
     } 
     string viewname = viewNames[0]; 
     writer.WriteLine("the viewname is " + viewname); 
     DataSourceView view = ds.GetView(viewname); 
     view.Select(...); //this really has to be asynchronous? 
     //write out some stuff from the data source 
    } 

你想要哪种类型的数据绑定控件的?如果你想要表格格式,你应该从System.Web.UI.WebControls.DataBoundControl得到你的控制。而对于分层格式则从System.Web.UI.WebControls.HierarchicalDataBoundControl派生。他们都有一个属性来分配一个DataSource控件。

对于DataBoundControl您应该重写PerformDataBinding。此方法有一个名为data的参数,其中包含DataSource提供的数据。

public class Test : System.Web.UI.WebControls.DataBoundControl 
{ 

    protected override void PerformDataBinding(System.Collections.IEnumerable data) 
    { 
     base.PerformDataBinding(data); 
    } 

} 

对于HierarchicalDataBoundControl你应该重写具有相同名称为DataBoundControl的方法。并通过GetData方法获取视图。

public class Test : System.Web.UI.WebControls.HierarchicalDataBoundControl 
{ 

    protected override void PerformDataBinding() 
    { 
     base.PerformDataBinding(); 

     System.Web.UI.HierarchicalDataSourceView view = base.GetData("View Path"); 
    } 

} 
+0

完美。我想我错过了这样的事情。谢谢! – Eric 2009-12-02 17:52:21