So all items in your context menu are unique. Keep a HashSet that remembers which menu items are already added.
In your form class:
private HashSet<MenuItem> addedMenuItems;
void MyForm
{
InitializeComponents();
List<MenuItem> menuItems = this.ContextMenu1.MenuItems.Cast<MenuItem>().ToList();
this.addedMenuItems = new HashSet<MenuItem>(menuItems);
}
private bool IsMenuItemAdded(MenuItem menuItem)
{
return this.addedMenuItems.Contains(menuItem);
}
private void AddMenuItem(MenuItem menuItem)
{
if (!this.IsMenuItemAdded(menuItem))
{
this.ContextMenu1.MenuItems.Add(menuItem);
this.AddedMenuItems.Add(menuItem);
}
}
private void RemoveMenuItem(MenuItem menuItem)
{
if (this.IsMenuItemAdded(menuItem))
{
this.ContextMenu1.MenuItems.Remove(menuItem);
addedMenuItems.Remove(menuItem);
}
}
The problem with this is that you can't prevent that others add menu items directly
Reusable Solution: make a MenuItemCollectionHandler
Create a class, that takes a Menu.MenuItemCollection (or if you want: a Menu), and that makes sure that you can only Add / Remove predefined items
class UniqueMenuItemCollectionHandler
{
private HashSet<MenuItem> addedMenuItems;
private MenuItemCollection menuItemCollection;
public UniqueMenuItemCollectionHandler(MenuItemCollection menuItemCollection)
{
this.menuItemCollection = menuItemCollection;
this.addedMenuItems = new HashSet<MenuItem>(menuItemCollection);
}
private bool IsMenuItemAdded(MenuItem menuItem)
{
return this.addedMenuItems.Contains(menuItem);
}
private void AddMenuItem(MenuItem menuItem)
{
if (!this.IsMenuItemAdded(menuItem))
{
this.menuItemCollection.Add(menuItem);
this.addedMenuItems.Add(menuItem);
}
}
private void RemoveMenuItem(MenuItem menuItem)
{
if (this.IsMenuItemAdded(menuItem))
{
this.menuItemCollection.Remove(menuItem);
addedMenuItems.Remove(menuItem);
}
}
}
The most neat solution would be that you'd create your own derived class of MenuItemCollection. However, you can't assign this to the MenuItemCollection of your menu: it is read-only.
Another method would be that you create a derived class of ContextMenu where you make sure that menu items can only be added via your functions, but alas: the needed methods are not virtual, so you can't override them.
The only method that is left is that you create your own control, similar to a ContextMenu, but I think the amount of work needed for that never weighs up against the benefits of this special control.
Create a class that asserts that you have only unique menuItems. If you derive it from MenuItemCollection, you can't guarantee that people won't use one of the Add methods of the base class. S
class UniqueMenuItemCollection : MenuItemCollection
{
public Dictionary(MenuItemId, MenuItem
}
You can assign this enum value to the Tag of the context