2009-12-02 111 views
1

我正在嘗試編寫自定義控件。我想讓它的用戶指定一個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 
    } 

回答

1

你想要哪種類型的數據綁定控件的?如果你想要表格格式,你應該從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