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

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

4

1 回答 1

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

您显然可以进一步扩展它以在您需要的任何页面上执行相同的操作,但是您的页面越复杂,您的性能影响就越大。

我希望我说服你不要这样做...

于 2013-08-01T16:40:59.630 回答