首页 > 解决方案 > 我可以将 ContextMenuStrip 上的多个项目绑定到同一个函数吗?

问题描述

ContextMenuStrip如果表单中的某些对象可见或不可见,我制作了一个填充了 Items 的内容。

当我单击此上下文菜单的一项时,表单上的一个属性正在根据单击的菜单项发生变化。我想访问此类中的一个函数,该函数读取该属性并在表单中进行一些更改。

一些代码:

private void AddMenuItems(){
    ContextMenuStrip c = new ContextMenuStrip();
    if (extension.Equals("sty") || extension.Equals("st2") || extension.Equals("sst")) {
        this.fileExtension = "style";
        c.Items.Add("Style files (c/u)");
    }    
    if (extension.Equals("txt")){
        this.fileExtension = "text";
        c.Items.Add("Text files (c/u)");
    }
    // some other ifs
    // I've tried this, but only the last one is registered
    foreach(ToolStripMenuItem m in c.Items){
        m.Click += CheckSelectedType;
    }
}

private void CheckSelectedType(object sender, EventsArgs e){
    switch(this.fileExtension){
        case "style":
            // do something
            break;
        case "text":
            // do something
            break;
    }
}

标签: c#winforms

解决方案


你可以这样写:

private ContextMenuStrip CreateContextMenuStrip(string extension)
{
  var result = new ContextMenuStrip();
  if ( extension.Equals("sty") || extension.Equals("st2") || extension.Equals("sst") )
  {
    var item = result.Items.Add("Style files (c/u)");
    item.Tag = "style";
    item.Click += ContextMenuItem_Click;
  }
  else
  if ( extension.Equals("txt") )
  {
    var item = result.Items.Add("Text files (c/u)");
    item.Tag = "text";
    item.Click += ContextMenuItem_Click;
  }
  return result;
}

private void ContextMenuItem_Click(object sender, EventArgs e)
{
  switch ( (string)( (ToolStripItem)sender ).Tag )
  {
    case "style":
      // ...
      break;
    case "text":
      // ...
      break;
  }
}

推荐阅读