使用C#从controlcollection中递归获取控件集合

发布于 2024-10-08 15:11:33 字数 652 浏览 0 评论 0原文

目前,我正在尝试从递归控件集合(重复器)中提取动态创建的控件(复选框和下拉列表)的集合。这是我正在使用的代码。

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

我在使用以下行时遇到问题:

resultCollection.Add((T)control);

我收到错误...

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

有什么想法吗?

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?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

友谊不毕业 2024-10-15 15:11:33

问题:

由于T可以是引用类型值类型,编译器需要更多信息。

您无法将Integer 转换为Control

解决方案:

要解决此问题,请添加 where T : Controlwhere T : class (更通用的)约束声明 T 始终是引用类型。

示例:

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);
    }
}
  • 您也不需要 ref 关键字。由于 List 是引用类型,因此将传递它的引用。

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.
帥小哥 2024-10-15 15:11:33

将其更改为

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

这将比您的 cod 更快,因为它不会调用 GetType()
请注意,它还将添加继承 T 的控件。

您还需要通过添加 where T : Control 来约束类型参数。

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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文