自定义控件使用DataSourceId

时间:2009-12-02 17:17:32

标签: c# asp.net-3.5 custom-controls

我正在尝试编写自定义控件。我想允许其用户指定一个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
    }

1 个答案:

答案 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");
    }

}