Не удается найти элемент управления из строки

У меня есть собственный метод расширения, который (должен) найти элемент управления через строку и выполнить щелчок по этому элементу управления. Я установил точку останова, и она никогда не if (c is 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();
    }

Любая помощь приветствуется.

2 ответа

Решение

Чтобы найти все вложенные элементы, вам нужен рекурсивный поиск. Вот пример; он собирает все предметы в List<ToolStripMenuItem> и проверки для искомого имени. Я добавил эту строку в подпись вашего звонка..:

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

ToolStripMenuItem не считается элементом управления, вместо этого вы должны использовать его контейнер

if(c is MenuStrip)
{
    foreach(ToolStripMenuItem tsItem in ((MenuStrip)c).Items)
    {
        if (tsItem.Name == item)
        {
            tsItem.PerformClick();
        }
    }
}
Другие вопросы по тегам