正在检查ContextMenuStrip是否包含项



我有一个ContextMenuStrip,在运行时我会向该ContextMenuStap添加新项,我想知道如何检查ContextMenuStep是否包含该项,如果同一项已经在ContextMenuSStrip中,则不要再添加该项。仅添加不在ContextMenuStrip中的项。

我该怎么做?

public Form3()
{
InitializeComponent();
loginicon.ContextMenuStrip = contextMenuStrip1;
}
private void loginicon_Click(object sender, EventArgs e)
{
cmd = new SqlCommand($"Select * from UserInfo where Username='{user}'");
cmd.Connection = con;
con.Open();
SqlDataReader reader = cmd.ExecuteReader();
while (reader.Read())
{
id = reader[3].ToString();
}
// contextMenuStrip1.Items.Contains(user);
contextMenuStrip1.Items.Add(user);
contextMenuStrip1.Items.Add(id);
contextMenuStrip1.Items.Add("Logout");
reader.Close();
con.Close();
}

这是我为那个ContextMenuStrip编写的代码。

我不确定,但您可以使用foreach循环检查所有项目

foreach (ToolStripMenuItem contextMenuItem in contextMenuStrip1.Items)
{
contextMenuItem.Text.Contains("Whatever string");
}

否则";对于";环如果你只想测试中的一个项目

int thenumber_of_object_inside_contextstripmenu = 1;//the number of object
contextMenuStrip1.Items[thenumber_of_object_inside_contextstripmenu].Text.Contains("Whatever string");//should output true/false

这是可以做到的,如果我把代码放在form_load事件而不是按钮点击

因此上下文菜单中的所有项目都是唯一的。保留一个HashSet,它可以记住已经添加了哪些菜单项。

在你的形式类:

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);
}
}

这个问题是,你不能阻止其他人直接添加菜单项

可重用解决方案:制作MenuItemCollectionHandler

创建一个类,该类采用Menu.MenuItemCollection(或者如果您需要:一个Menu(,并确保您只能添加/删除预定义的项目

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);
}
}
}

最巧妙的解决方案是创建自己的MenuItemCollection派生类。但是,不能将其分配给菜单的MenuItemCollection:它是只读的。

另一种方法是创建ContextMenu的派生类,确保菜单项只能通过函数添加,但遗憾的是:所需的方法不是虚拟的,因此无法覆盖它们。

剩下的唯一方法是创建自己的控件,类似于ContextMenu,但我认为所需的工作量永远不会与这种特殊控件的好处相抗衡。

创建一个类,声明您只有唯一的menuItems。如果从MenuItemCollection派生它,则不能保证人们不会使用基类的Add方法之一。S

class UniqueMenuItemCollection : MenuItemCollection
{
public Dictionary(MenuItemId, MenuItem
}

您可以将此枚举值分配给上下文的Tag

最新更新