winforms 如何获取ToolStripDropDownItem的单击事件处理程序名称?

bpzcxfmw  于 2022-11-25  发布在  其他
关注(0)|答案(1)|浏览(164)

我在Windows Forms中有一个旧项目,它有300多个菜单,在MDI窗体中有菜单单击事件。有没有办法获得字符串形式的单击事件名称(例如“toolStripMenuItem_Click”)?我试过这样做,

foreach (ToolStripMenuItem menu in menuStrip.Items)
{
   foreach (ToolStripDropDownItem submenu in menu.DropDownItems)
   {
       var _events= submenu.GetType()
                     .GetProperties(BindingFlags.NonPublic | BindingFlags.Instance)
                     .OrderBy(pi => pi.Name).ToList();
   }
}

但它总是返回空值。正确的方法是什么?

3zwjbxry

3zwjbxry1#

在运行时检索事件处理程序并不容易,尤其是在Forms框架中,其中某些事件在后台进行特殊处理。
一种更简单的方法(如果在运行时不需要名称,而是在设计时需要)是在MyForm.designer.cs文件上使用正则表达式来提取单击处理程序的名称。
请参见此示例来源:

private void button1_Click(object sender, EventArgs e)
{
    string fileLocaton = @"C:\Users\nineb\source\repos\WindowsFormsApp37\WindowsFormsApp37\Form1.Designer.cs";
    string fileContent = File.ReadAllText(fileLocaton);

    // Find all menu items in the designer file
    var matches = Regex.Matches(fileContent, @"System\.Windows\.Forms\.ToolStripMenuItem (.+?)\;");
    foreach (Match match in matches)
    {
        string menuName = match.Groups[1].Value;
        textBox1.AppendText("Menuitem " + menuName + Environment.NewLine);

        // For each menu item, find all the event handlers
        var clickMatches = Regex.Matches(fileContent, 
            @"this\." + Regex.Escape(menuName) + @"\.Click \+\= new System\.EventHandler\(this\.(.+?)\)\;");
        foreach (Match clickMatch in clickMatches)
        {
            string handlerName = clickMatch.Groups[1].Value;
            textBox1.AppendText("Eventhandler " + handlerName + Environment.NewLine);
        }
    }
}

相关问题