首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >检查ContextMenuStrip是否包含项

检查ContextMenuStrip是否包含项
EN

Stack Overflow用户
提问于 2020-08-31 01:42:53
回答 3查看 151关注 0票数 0

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

我该怎么做呢?

代码语言:javascript
复制
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编写的代码。

EN

回答 3

Stack Overflow用户

发布于 2020-08-31 02:31:28

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

代码语言:javascript
复制
        foreach (ToolStripMenuItem contextMenuItem in contextMenuStrip1.Items)
        {
          contextMenuItem.Text.Contains("Whatever string");
        }

或者"for“循环。如果您只想测试其中一个项目

代码语言:javascript
复制
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
票数 0
EN

Stack Overflow用户

发布于 2020-08-31 02:59:07

如果我将代码放在form_load事件而不是按钮单击中,就可以做到这一点

票数 0
EN

Stack Overflow用户

发布于 2020-09-02 18:58:41

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

在您的窗体类中:

代码语言:javascript
复制
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 (或者如果你想要的话:一个菜单),这确保你只能添加/删除预定义的项目

代码语言:javascript
复制
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

代码语言:javascript
复制
class UniqueMenuItemCollection : MenuItemCollection
{
    public Dictionary(MenuItemId, MenuItem
}

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63660327

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档