C# 通过标记属性查找WinForm控件的能力

C# 通过标记属性查找WinForm控件的能力,c#,winforms,C#,Winforms,我在C#从事一个现有的WinForm项目。原始代码使用标记为一组文本框传递硬件寻址信息,这些文本框表示连接的微控制器系统中的某些硬件寄存器。我知道如何使用control.ControlCollection.find方法搜索未知控件的名称,但我不清楚是否可以通过标记(在本例中仅为字符串)找到该控件。您可以使用LINQ查找基于标记的控件。 var items = parentControl.ControlCollection; var item = items.Cast<Control>

我在C#从事一个现有的WinForm项目。原始代码使用标记为一组文本框传递硬件寻址信息,这些文本框表示连接的微控制器系统中的某些硬件寄存器。我知道如何使用control.ControlCollection.find方法搜索未知控件的名称,但我不清楚是否可以通过标记(在本例中仅为字符串)找到该控件。

您可以使用
LINQ
查找基于
标记的控件。

var items = parentControl.ControlCollection;
var item = items.Cast<Control>().FirstOrDefault(control => String.Equals(control.Tag, tagName));
var items=parentControl.ControlCollection;
var item=items.Cast().FirstOrDefault(control=>String.Equals(control.Tag,tagName));

跟进我的评论:

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的问题有关,但我想我会补充一下

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

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

迭代控件集合并检查特定的标记值?您应该更改设计,我们不应该执行此类任务。当然,您必须遍历所有控件并检查每个控件的
标记
,直到找到为止。
Find
的内部实现也应该做同样的事情。速度完全取决于内部的
数据结构。我的回答有局限性。它不是递归的。@Tilak,在不需要递归的情况下,您的初始解决方案非常有效。谢谢你的建议,我很乐意帮忙。佩斯科利诺的回答有用吗?他的答案可能会更好,也可能不会更好,因为它实际上返回控件,而且如果您有多个设置了标记属性的控件,那么您可以将其作为特定标记进行搜索,而不是在这里“捕获”任何标记。@MD,为了将来的访问者的利益,取消删除我的答案(对于不需要递归的情况)@马可拉科维奇世界上最延迟的回应:确实有标签属性。此问题被标记为
winforms
问题,您链接了系统。**Web**.UI控件类。