检查ContextMenuStrip是否包含一个项目

问题描述

我有一个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的代码

解决方法

不确定,但是您可以使用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
,

这可以完成,如果我将代码放在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(或者如果需要:一个菜单),并确保您只能添加/删除预定义的项目

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,但我认为为此所需的工作量永远不会抵消这种特殊控件的好处。

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

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

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...