我有一个ContextMenuStrip,在运行时我向该ContextMenuStrip添加新的项,我想知道如何检查ContextMenuStrip是否包含该项,如果相同的项已经存在于ContextMenuStrip中,则不再添加该项。仅添加不在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编写的代码。
发布于 2020-08-31 02:31:28
我不确定,但您可以使用foreach循环来检查所有项目
foreach (ToolStripMenuItem contextMenuItem in contextMenuStrip1.Items)
{
contextMenuItem.Text.Contains("Whatever string");
}或者"for“循环。如果您只想测试其中一个项目
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发布于 2020-08-31 02:59:07
如果我将代码放在form_load事件而不是按钮单击中,就可以做到这一点
发布于 2020-09-02 18:58:41
因此,上下文菜单中的所有项目都是唯一的。保留一个记住已经添加了哪些菜单项的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 (或者如果你想要的话:一个菜单),这确保你只能添加/删除预定义的项目
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
}您可以将此枚举值分配给上下文的标记
https://stackoverflow.com/questions/63660327
复制相似问题