我正在尝试编写自定义控件。我想允许其用户指定一个DataSourceId(很像GridView,Repeater等)。
我可以找到与id对应的DataSource。我可以获得相关的DataSourceView。但是,获取数据的唯一方法似乎是使用异步Select方法。当然,我可以设置回调,以便我的代码阻塞,直到回调发生。但这需要这么多奇怪的旋转,我怀疑我做错了什么。
如果我想让控件像其他一些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
}
答案 0 :(得分:1)
您想要哪种类型的DataBound控件?如果您需要表格格式,则应从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");
}
}