2011-06-08 51 views
3

我有一個用戶需要能夠從中進行選擇的實體列表。 我的窗口上有一個ContextMenuStrip,並且每個類別的實體都有一些MenuItems。ToolStripMenuItem添加到幾個地方?

在庫的例子,認爲「工作人員」,「Borrowables」,「食客」等......

「工作人員」可能含有「僱傭形式」 - > {「全職」,「部分時間「}或」按性別「 - > {」男性「,」女性「}等。

」可借閱「可能包含」按類型「 - > {」Books「,」Magazines「,」DVD「 「按流派」 - > {「小說」 - > {「科幻」,「浪漫」,「犯罪」},「非小說」{「科學」,「音樂」,「歷史」}}等

基本上,一個實體可以同時在多個地方。一名工作人員可以是全職的,女性。可借用的可能是一本書和一部浪漫小說。等等

我編程式創建了一個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

這是ControlCollection的功能。從Control派生的任何對象只能同時在一個ControlCollection中。

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

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

    void OnClick(); 
} 

然後你可以創建自己的類將從ToolStripMenuItem派生,採取的ICommand作爲參數,並使用它的OnClick。現在您應該可以爲單個命令定義單個對象實現ICommand。

相關問題