开发者

Iterating Through All DropDownList In an ASP.NET WebForm C#

开发者 https://www.devze.com 2023-03-28 21:52 出处:网络
What is the object that I would have to reference in order to iterate through all the 开发者_JAVA百科DropDownList on a web page. I have a web page with several drop down list on it. I want a piece of

What is the object that I would have to reference in order to iterate through all the 开发者_JAVA百科DropDownList on a web page. I have a web page with several drop down list on it. I want a piece of code that will do the following:

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

Thanks.


If you don't need to worry about nested controls in which case you would need recursion, something like below should work.

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

If recursion is required you could make a method like below..

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

And then modify your loop...

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


foreach (var dropDownList in Page.Controls.OfType<DropDownList>())
{

}


There is no magical all control container. You're going to have to recursively traverse your control tree and find all the drop downs.

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

That should recursively walk down the control tree and invoke the method on all elements of type T. Example:

DoSomethingForAllControlsOf<DropDownList>(this, someFunction);


You can't run a foreach loop on that because although you have numerous DropDownLists, they are not part of an iterable collection. You could, however, store each DropDownList into an array, and iterate through that array.


To get all of the dropdown controls, you'll probably need to loop through recursively. You can use this function to do it:

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


The LINQ way:

First you need an extension method to grab all the controls of the type you're interested in:

//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;  
        }  
    }  
}`  

Then you can iterate as you wanted:

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;
0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号