你被难住了,因为你的方法只会遍历顶层控件,因为迭代 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();
}
}
您显然可以进一步扩展它以在您需要的任何页面上执行相同的操作,但是您的页面越复杂,您的性能影响就越大。
我希望我说服你不要这样做...