Robbie M. McKenzie
Robbie M. McKenzie

Reputation: 31

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

What is the object that I would have to reference in order to iterate through all the 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.

Upvotes: 3

Views: 7349

Answers (7)

Syam Gopi Chand
Syam Gopi Chand

Reputation: 1

while(dropdownlist1.SelectedIndex++ < dropdownlist1.Items.Count)
{
     if (dropdownlist1.SelectedValue == textBox1.text)
     {
       // do stuff here.
     }
}

//resetting to 0th index(optional)
dropdownlist1.SelectedIndex = 0;

Upvotes: 0

immutabl
immutabl

Reputation: 6903

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

Upvotes: 0

James Johnson
James Johnson

Reputation: 46057

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

Upvotes: 0

Quintin Robinson
Quintin Robinson

Reputation: 82345

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
}

Upvotes: 3

Tejs
Tejs

Reputation: 41246

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

Upvotes: 1

Pedro
Pedro

Reputation: 11874

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

}

Upvotes: 1

Jon Martin
Jon Martin

Reputation: 3392

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.

Upvotes: 0

Related Questions