用于类似功能的 C# WinForm 多次单击事件处理程序

C# WinForm multiple click event handlers for similar function

我有一些 toolStripMenuItems 作为一系列网站的有用链接,代码的粗略示例如下:

private void toolStripMenuItem1_Click(object sender, EventArgs e)
{
    Process.Start("http://www.google.com");
}

private void toolStripMenuItem2_Click(object sender, EventArgs e)
{
    Process.Start("http://www.bing.com");
}

private void toolStripMenuItem3_Click(object sender, EventArgs e)
{
    Process.Start("https://www.duckduckgo.com");
}

private void toolStripMenuItem4_Click(object sender, EventArgs e)
{
    Process.Start("http://www.yahoo.com/");
}
...

有没有更优雅的方法来处理这个问题?

"Mash" 将所有事件处理程序合二为一,然后使用 sender 查看 ToolStripMenuItem 被单击的内容。

private void toolStripMenuItem_Click(object sender, EventArgs e)
{
    if(sender == toolStripMenuItem1)
        Process.Start("http://www.google.com");
    else if(sender == toolStripMenuItem2)
        Process.Start("http://www.bing.com");
    else if(sender == toolStripMenuItem3)
        Process.Start("http://www.duckduckgo.com");
    else if(sender == toolStripMenuItem4)
        Process.Start("http://www.yahoo.com");
}

或者如 Artem 注释所示,使用 ControlTag 成员来存储 String 代表要访问的站点。然后将 sender.Tag 转换为 String 并使用它。

toolStripMenuItem1.Tag = "http://www.google.com";
toolStripMenuItem2.Tag = "http://www.bing.com";
toolStripMenuItem3.Tag = "http://www.duckduckgo.com";
toolStripMenuItem4.Tag = "http://www.yahoo.com";
...
private void toolStripMenuItem_Click(object sender, EventArgs e)
{
    Process.Start(sender.Tag.ToString());
}

将 url 放入菜单项标签并将此处理程序附加到所有菜单项(希望它有效)

private void toolStripMenuItemClick(object sender, EventArgs e)
{
    Process.Start(sender.Tag.ToString());
}

首先要做的是对每个使用相同的处理程序:

toolStripMenu1.Click += toolStripItemClick;
toolStripMenu2.Click += toolStripItemClick;
// etc

我会为此使用 Tag 属性,在构建 toolStripItems 时设置它:

toolStripMenu1.Tag = "http://www.google.com";

然后定义你的处理程序:

private void toolStripItemClick(object sender, EventArgs e)
{
    var c = (ToolStripMenuItem)sender;
    Process.Start(c.Tag.ToString());
}

您也可以使用lambda表达式订阅点击事件:

toolStripMenuItem1.Click += (_, __) => Process.Start("process1");
toolStripMenuItem2.Click += (_, __) => Process.Start("process2");