自定义控件使用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");
}
}
完美。我想我错过了这样的事情。谢谢! – Eric 2009-12-02 17:52:21