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

依然范特西╮ 提交于 2019-11-27 08:22:02

问题


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?


回答1:


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.



回答2:


Change it to

var c = control as T;
if (c != null)
    resultCollection.Add(c);

This will be faster than your cod, since it doesn't call GetType().
Note that it will also add controls that inherit T.

You'll also need to constrain the type parameter by adding where T : Control.



来源:https://stackoverflow.com/questions/4463319/using-c-sharp-to-recursively-get-a-collection-of-controls-from-a-controlcollecti

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!