Search code examples
c#asp.netcontrolcollection

Using C# to recursively get a collection of controls from a controlcollection


Currently I am trying to extract a collection of dynamically created controls (checkboxes and dropdownlists) from a recursive control collection (repeater). This is the code I am using.

private void GetControlList<T>(ControlCollection controlCollection, ref List<T> resultCollection)
{
    foreach (Control control in controlCollection)
    {
        if (control.GetType() == typeof(T))
            resultCollection.Add((T)control);

        if (control.HasControls())
            GetControlList(controlCollection, ref resultCollection);
    }
}

I am having problems with the following line:

resultCollection.Add((T)control);

I get the error ...

Cannot convert type 'System.Web.UI.Control' to 'T'

Any ideas?


Solution

  • Problem:

    Since T can be a reference type or a value type, compiler needs more information.

    You can not convert and Integer to Control.

    Solution:

    To fix this, add where T : Control or where T : class (a more general) constraint to state that T will always be a reference type.

    Example:

    private void GetControlList<T>(ControlCollection controlCollection, ref List<T> resultCollection)
    where T : Control
    {
        foreach (Control control in controlCollection)
        {
            //if (control.GetType() == typeof(T))
            if (control is T) // This is cleaner
                resultCollection.Add((T)control);
    
            if (control.HasControls())
                GetControlList(control.Controls, ref resultCollection);
        }
    }
    
    • You also don't need ref keyword. Since, List is a reference type, it's reference will be passed.