在ASP中遍历所有下拉列表.. NET WebForm c#

本文关键字:下拉列表 NET WebForm ASP 遍历 | 更新日期: 2023-09-27 18:06:07

为了遍历网页上的所有下拉列表,我必须引用的对象是什么?我有一个网页上有几个下拉列表。我想要这样一段代码:

foreach (DropDownList d in xxx)
{
    someFunction(d, d.ID);    
}

谢谢。

在ASP中遍历所有下拉列表.. NET WebForm c#

如果你不需要担心嵌套的控件,在这种情况下你需要递归,下面的东西应该可以工作。

foreach(DropDownList list in Controls.OfType<DropDownList>())
{
    //TODO: Something with list
}

如果需要递归,可以创建如下方法:

public static IEnumerable<Control> GetAllControls(Control parent)
{
    if(null == parent) return null;
    return new Control[] { parent }.Union(parent.Controls.OfType<Control>().SelectMany(child => GetAllControls(child));
}

然后修改你的循环…

foreach(DropDownList list in GetAllControls(this).OfType<DropDownList>())
{
    //TODO: Something with list
}
foreach (var dropDownList in Page.Controls.OfType<DropDownList>())
{
}

没有神奇的全控制容器。你需要递归地遍历控制树,找到所有的下拉列表。

public void DoSomethingForAllControlsOf<T>(Control thisControl, Action<T> method)
    where T: class
{
    if(thisControl.Controls == null)
       return;
    foreach(var control in thisControl.Controls)
    {
        if(control is T)
           method(control as T);
        DoSomethingForAllControlsOf<T>(control, method);
    }
}

应该递归地遍历控制树并对所有t类型的元素调用该方法。示例:

DoSomethingForAllControlsOf<DropDownList>(this, someFunction);

你不能在上面运行foreach循环,因为尽管你有很多dropdownlist,但它们不是可迭代集合的一部分。但是,您可以将每个DropDownList存储到一个数组中,并遍历该数组。

要获得所有下拉控件,您可能需要递归地进行循环。您可以使用以下函数:

 public Control DisableDropDowns(Control root)
 {             
     foreach (Control ctrl in root.Controls)
     {
         if (ctrl  is DropDownList)
             ((DropDownList)ctrl).Enabled = false;
         DisableDropDowns(ctrl);
     }
 }

LINQ方式:

首先,您需要一个扩展方法来获取您感兴趣的类型的所有控件:

//Recursively get all the formControls  
public static IEnumerable<Control> GetAllControls(this Control parent)  
{  
    foreach (Control control in parent.Controls)  
    {  
        yield return control;  
        foreach (Control descendant in control.GetAllControls())  
        {  
            yield return descendant;  
        }  
    }  
}`  

然后你可以按你想要的迭代:

var formCtls = this.GetAllControls().OfType<DropDownList>();`
foreach(DropDownList ddl in formCtls){
    //do what you gotta do ;) 
}
while(dropdownlist1.SelectedIndex++ < dropdownlist1.Items.Count)
{
     if (dropdownlist1.SelectedValue == textBox1.text)
     {
       // do stuff here.
     }
}
//resetting to 0th index(optional)
dropdownlist1.SelectedIndex = 0;