Пользовательский элемент управления использует DataSourceId - PullRequest
1 голос
/ 02 декабря 2009

Я пытаюсь написать пользовательский элемент управления. Я хочу разрешить его пользователю указывать DataSourceId (так же, как GridView, Repeater и т. Д.).

Я могу найти источник данных, который соответствует идентификатору. И я могу получить связанный 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 Ответ

1 голос
/ 02 декабря 2009

Какой тип элемента управления DataBound вы хотите? Если вы хотите табличный формат, вы должны получить контроль от System.Web.UI.WebControls.DataBoundControl. А для иерархического формата производные от System.Web.UI.WebControls.HierarchicalDataBoundControl. У них обоих есть свойство назначать элемент управления DataSource.

Для DataBoundControl вы должны переопределить PerformDataBinding. Этот метод имеет параметр с именем data, который содержит предоставленные данные из источника данных.

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

}
...