2013-08-01 54 views
0

我有一個表格中有15個下拉列表。我想用單個數據源中的相同值填充每個ddl。使用循環將多個下拉列表綁定到相同的數據源

而不是做下面的X 15:

ddl.datasource = x 
ddl.databind() 

是否有可能遍歷所有DDL的一個表,並指定數據源等等都在一個去了?

這樣的事情? (我知道代碼是錯誤的,但我不確定是否完整正確的代碼)

For Each ctrl In tblNetwork.Controls 
     If TypeOf ctrl Is DropDownList Then 
      ddl.DataSource = usr 
      ddl.DataBind() 
     End If 
Next ctrl 

似乎是一個基本的,但它讓我難住。

回答

0

由於您的方法只會遍歷頂級控件,因爲迭代tblNetworks.Controls將不會遞歸。

我認爲這通常是一個非常糟糕的想法,因爲您的頁面將遭受遞歸,您需要進行遞歸才能捕獲頁面中的所有下拉列表。這就是說,這裏有一個解決方案(在C#中,對不起),無論您的下拉列表的嵌套級別如何,都可以工作。

首先,你需要創建一個平展任何IEnumerable的,所以我們可以使用LINQ一個輔助方法:

public static class ControlExtensions 
{ 
    public static IEnumerable<T> Flatten<T>(this IEnumerable<T> e, Func<T, IEnumerable<T>> f) 
    { 
     return e.SelectMany(c => f(c).Flatten(f)).Concat(e); 
    } 
} 

現在你的代碼變成這樣:

var result = this.Controls.Cast<DropDownList>().Flatten(x=>x.Controls.Cast<DropDownList>()); 
DropDownList current; 
foreach (var item in result) 
{ 
    if (item is DropDownList) 
    { 
     current = item as DropDownList; 
     current.DataSource = your_data_source; 
     current.DataBind(); 
    } 
}  

可以明顯延長此進一步在您需要的任何頁面上也可以做到這一點,但是頁面越複雜,性能就越大。

我希望我說服你這樣做......

+0

感謝Icarus的迴應,我會試試這個。我只是感興趣的是,如果有一種快速綁定所有ddls的方式,而不需要一遍又一遍地重複代碼。我想這不是那麼直截了當? – Jimsan

+0

你想要做的事情很簡單(如上面的代碼所證明的),但在一般情況下不是高性能的。我從字面上看到,人們進行這種遞歸只是爲了在當前頁面外的另一個容器上設置標籤的文本,並且當您可以使用ONE函數調用解決問題時,性能非常糟糕(數千個函數調用)。再次,這將工作,但性能是可怕的,當有很多嵌套(服務控制,內部其他服務器控件等) – Icarus