使用循环将多个下拉列表绑定到同一数据源

时间:2013-08-01 15:59:24

标签: asp.net vb.net data-binding drop-down-menu for-loop

我在表格中有一个包含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

似乎是一个基本的,但它让我难过。

1 个答案:

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

显然,您可以在需要的任何页面上进一步扩展此功能,但页面越复杂,性能就越高。

我希望我能说服你这样做......