我有一個用戶需要能夠從中進行選擇的實體列表。 我的窗口上有一個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 :(
}