如何解决检查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
}
您可以将此枚举值分配给上下文的标签
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。