用于类似功能的 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 注释所示,使用 Control
的 Tag
成员来存储 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");
我有一些 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 注释所示,使用 Control
的 Tag
成员来存储 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");