11

我正在使用 C# 处理现有的 WinForm 项目。原始代码使用 Tag 为一堆文本框传达硬件寻址信息,这些文本框代表连接的微控制器系统中的某些硬件寄存器。我知道如何通过使用 Control.ControlCollection.Find 方法搜索其名称来找到未知控件,但我不清楚是否可以通过标记找到控件(在本例中只是一个字符串)。

4

3 回答 3

11

跟进我的评论:

private void FindTag(Control.ControlCollection controls)
{
    foreach (Control c in controls)
    {
        if (c.Tag != null)
        //logic

       if (c.HasChildren)
           FindTag(c.Controls); //Recursively check all children controls as well; ie groupboxes or tabpages
    }
}

然后,您可以在 if 语句中获取控件名称,然后从那里做任何您想做的事情。

只需在此解决方案中添加一个编辑,因为几年后它仍然很少获得支持。您还可以修改此解决方案以检查控件的类型c并执行不同类型的逻辑。因此,如果您想遍历所有控件并以Textbox一种方式和RadioButon另一种方式处理,您也可以这样做。我也不得不在一些项目中这样做,我只需稍微更改上面的代码即可使其正常工作。不一定与 OP 的问题相关,但我想我会添加它。

于 2013-11-04T19:53:06.320 回答
9

您可以使用LINQ查找控件基于Tag

var items = parentControl.ControlCollection;
var item = items.Cast<Control>().FirstOrDefault(control => String.Equals(control.Tag, tagName));
于 2013-11-04T19:53:04.663 回答
6
public static Control FindByTag(Control root, string tag)
{
    if (root == null)
    {
        return null;
    }

    if (root.Tag is string && (string)root.Tag == tag)
    {
        return root;
    }

    return (from Control control in root.Controls
            select FindByTag(control, tag)).FirstOrDefault(c => c != null);
}

将最外层的控件传递给它(即您要搜索的表单或容器)。请注意,这会将根控件包含在搜索中。

于 2013-11-04T20:08:11.977 回答