我有一个自定义扩展方法(应该)通过字符串查找控件,并执行对该控件的单击。我已经设置了一个断点并且它已经进入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();
}
感谢任何帮助。
答案 0 :(得分:1)
ToolStripMenuItem
不被视为控件,您必须改为使用其容器
if(c is MenuStrip)
{
foreach(ToolStripMenuItem tsItem in ((MenuStrip)c).Items)
{
if (tsItem.Name == item)
{
tsItem.PerformClick();
}
}
}
答案 1 :(得分:1)
要查找所有嵌套项,您需要进行递归搜索。这是一个例子;它收集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);
}