ToolStripMenuItem添加到几个地方?

时间:2011-06-08 06:45:43

标签: c# winforms contextmenustrip toolstripmenu

我有一个用户需要能够从中选择的大量实体。 我的窗口上有一个ContextMenuStrip,每个实体类别都有一些MenuItem。

在图书馆的例子中,想想“工作人员”,“借款人”,“赞助人”等......

“员工”可能包含“按就业类型” - > {“全职”,“兼职”或“按性别” - > {“男”,“女”等}

“Borrowables”可能包含“按类型” - > {“Books”,“Magazines”,“DVDs”}或“By Genre” - > {“小说” - > {“Sci-Fi”,“Romance”,“Crime”},“Non-Fiction”{“Science”,“Music”,“History”}}等等。

基本上,一个实体可以同时在几个地方。工作人员可以是全职,也可以是女性。可借的可能是一本书和一本浪漫小说。等

我已经以编程方式创建了List<ToolStripMenuItem>以及事件处理程序,标记和所有内容。然后我以编程方式浏览了每一个并将它们添加到各种菜单和子菜单中,以便可以从各种位置访问它们。我的想法是每个ToolStripMenuItem只需要内存中的一个对象,如果选中/取消选中,那么应该反映在所有这些对象上。

这似乎是一个优雅的解决方案,我真的很期待看到它的工作,但显然当我将ToolStripMenuItem添加到一个ToolStripMenuItemDropDownItems时,它会从添加它的任何地方删除。

这让我感到难过。如果它们都是同一个对象,我就不必编写大量代码来检查所有匹配的项目,因为检查一个会检查它们,并且取消选中一个将取消全部检查。

有没有其他方法可以用最少的代码完成这个?

这是我所拥有的一个小例子:

foreach (ToolStripMenuItem item in staffItems)
{
  Staff s = (Staff)item.Tag;

  foreach (ToolStripMenuItem tsmi in byStaffLocationToolStripMenuItem.DropDownItems)
    if ((Location)tsmi.Tag == s.Location)
      tsmi.DropDownItems.Add(item); // [1] Item added here

  foreach (ToolStripMenuItem tsmi in byStaffTypeToolStripMenuItem.DropDownItems)
    if ((StaffType)tsmi.Tag == s.StaffType)
      tsmi.DropDownItems.Add(item); // removed from [1] and added here instead :(
}

1 个答案:

答案 0 :(得分:1)

这是ControlCollection的功能。从Control派生的任何对象只能同时在一个ControlCollection中。

如果你想按照你的方法,我建议(草案)为你的命令引入抽象:

public interface ICommand
{
    string Name {get;set;}
    bool Enabled { get; set; }
    bool Checked { get; set; }

    void OnClick();
}

然后,您可以创建自己的类,该类将从ToolStripMenuItem派生,并将ICommand作为参数并使用它OnClick。现在,您应该能够为单个命令定义实现ICommand的单个对象。