C# Can';无法从字符串中定位控件

C# Can';无法从字符串中定位控件,c#,click,controls,C#,Click,Controls,我有一个自定义扩展方法,它(应该)通过字符串找到一个控件,然后单击该控件。我设置了一个断点,如果(c是ToolStripMenuItem)有人知道我哪里出错了吗?这是在WinForms上 private void PerformClickfromString() { string item = File.ReadAllText(@"C:\controltest.txt"); foreach (var c in this.Controls)

我有一个自定义扩展方法,它(应该)通过字符串找到一个控件,然后单击该控件。我设置了一个断点,如果(c是ToolStripMenuItem)有人知道我哪里出错了吗?这是在WinForms上

   private void PerformClickfromString()
    {
        string item = File.ReadAllText(@"C:\controltest.txt");

        foreach (var c in this.Controls)
        {
            if (c is ToolStripMenuItem)
            {
                var x = (ToolStripMenuItem)c;

                if (x.Name == item)
                {
                    x.PerformClick();
                }
            }
        }

    }

    private void button1_Click(object sender, EventArgs e)
    {
        PerformClickfromString();
    }

非常感谢您的帮助。

ToolStripMenuItem不被视为控件,您必须使用它的容器

if(c is MenuStrip)
{
    foreach(ToolStripMenuItem tsItem in ((MenuStrip)c).Items)
    {
        if (tsItem.Name == item)
        {
            tsItem.PerformClick();
        }
    }
}

要查找所有嵌套项,需要进行递归搜索。这是一个例子;它收集
列表中的所有项目,并检查搜索的名称。我已将该字符串添加到您的通话签名中..:

private void PerformClickfromString(string s)
{
    foreach (var c in this.Controls)
    {
        List<ToolStripMenuItem> items = new List<ToolStripMenuItem>();

        if (c is MenuStrip)
        {
            foreach (ToolStripMenuItem tsItem in ((MenuStrip)c).Items)
            {
                GetAllMenuItems(items, tsItem);
            }
        }
        ToolStripMenuItem found = items.Find(x => x.Name == s);
        if (found != null) found.PerformClick();
    }
}


void GetAllMenuItems(List<ToolStripMenuItem> items, ToolStripMenuItem menu)
{
    items.Add(menu);
    foreach(ToolStripMenuItem m in menu.DropDownItems)
        GetAllMenuItems(items, m);
}
private void PerformClickfromString(字符串s)
{
foreach(此.Controls中的var c)
{
列表项=新列表();
如果(c是菜单项)
{
foreach(ToolStripMenuItem tsItem in((MenuStrip)c).Items)
{
GetAllMenuItems(项目,tsItem);
}
}
ToolStripMenuItem found=items.Find(x=>x.Name==s);
if(find!=null)find.PerformClick();
}
}
void GetAllMenuItems(列表项,ToolStripMenuItem菜单)
{
项目。添加(菜单);
foreach(菜单中的ToolStripMenuItem m.DropDownItems)
GetAllMenuItems(项目,m);
}

foreach语句无法对类型为的变量进行操作…不包含“GetEnumerator”的公共定义
foreach语句无法对类型为“System.Windows.Forms.MenuStrip”的变量进行操作,因为“System.Windows.Forms.MenuStrip”不包含“GetEnumerator”
抱歉,我刚刚意识到我的错误,请立即尝试。没有错误,但也没有输出。有没有办法搜索所有ToolStripItemMenu对象?示例:文件>图层1>图层2。我要去第二层。只需搜索“文件”顶部TripS,您可以说
如果(tsItem.Items!=null)
我很确定,这将检查子级别。我会在内部检查之前打印出所有x.名称,并查看到达了哪些控件。感谢您的解释和示例!工作完美。