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