我在表格中有一个包含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 :(得分: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();
}
}
显然,您可以在需要的任何页面上进一步扩展此功能,但页面越复杂,性能就越高。
我希望我能说服你这样做......