C# 动态创建 ContextMenuStrip 子菜单和项目
C# Creating ContextMenuStrip Sub Menus and items Dynamically
我有一个在数据库中生成动态表单数据的 contextMenuStrip。
数据库中的数据有一个组列,我想用它为应用程序动态创建子菜单。
我的问题是它创建了重复的子菜单项,我希望将其分组。
这是我的列表和构造函数。
List<Tuple<WebLinks>> WebLinksList = new List<Tuple<WebLinks>>();
class WebLinks
{
public string Name { get; set; }
public string Link { get; set; }
public string Group { get; set; }
}
到目前为止,这是构建上下文菜单的工作代码,但我需要它来更改为组视图,而不仅仅是显示名称。
private void CreateMenu()
{
foreach (Tuple<WebLinks> wl in WebLinksList)
{
contextMenuStripMain.Items.Add(wl.Item1.Name);
}
contextMenuStripMain.Items.Add("-");
contextMenuStripMain.Items.Add("Settings");
contextMenuStripMain.Items.Add("Exit");
}
以上工作正常,但没有任何分组,所以我需要在某个地方的 "wl.Item1.Group" 中工作,但 google 对我的情况没有帮助。
我累了 This Stack Overflow 它给了我重复的组,我试图过滤它但没有运气。希望我说得有道理。
您可以使用 LINQ 对对象进行分组:
private void CreateMenu()
{
foreach (var group in WebLinksList.GroupBy(wl => wl.Item1.Group))
{
var groupItem = new ToolStripMenuItem(group.Key);
contextMenuStripMain.Items.Add(groupItem);
groupItem.DropDownItems.AddRange(group.Select(w => new ToolStripMenuItem(w.Item1.Name)).ToArray<ToolStripItem>());
}
contextMenuStripMain.Items.Add("-");
contextMenuStripMain.Items.Add("Settings");
contextMenuStripMain.Items.Add("Exit");
}
因此,对于每个不同的 Group
,将添加一个菜单项。 Name
.
添加了该组的子项到此项
[编辑] 我现在将 groupItem
创建为 ToolStripMenuItem
并将子项目添加到 DropDownItems
属性.
谢谢 René Vogt。我在阅读您的回答之前确定了 if,但无论如何还是决定接受您的回答。
这是您的解决方法,我刚刚为子菜单添加了一个点击事件。
foreach (var group in WebLinksList.GroupBy(wl => wl.Level))
{
var groupItem = new ToolStripMenuItem(group.Key);
contextMenuStripMain.Items.Add(groupItem);
groupItem.DropDownItemClicked += Tm_DropDownItemClicked;
groupItem.DropDownItems.AddRange(group.Select(w => new ToolStripMenuItem(w.Name)).ToArray<ToolStripItem>());
}
这是我的修复,但它是一样的。
foreach (var group in WebLinksList.GroupBy(wl => wl.Level))
{
ToolStripMenuItem tm = new ToolStripMenuItem();
tm.Text = group.Key;
tm.DropDownItemClicked += Tm_DropDownItemClicked;
tm.DropDownItems.AddRange(group.Select(w => new ToolStripMenuItem(w.Name)).ToArray<ToolStripItem>());
contextMenuStripMain.Items.Add(tm);
}
反正没有你我也做不到。谢谢
我有一个在数据库中生成动态表单数据的 contextMenuStrip。 数据库中的数据有一个组列,我想用它为应用程序动态创建子菜单。 我的问题是它创建了重复的子菜单项,我希望将其分组。
这是我的列表和构造函数。
List<Tuple<WebLinks>> WebLinksList = new List<Tuple<WebLinks>>();
class WebLinks
{
public string Name { get; set; }
public string Link { get; set; }
public string Group { get; set; }
}
到目前为止,这是构建上下文菜单的工作代码,但我需要它来更改为组视图,而不仅仅是显示名称。
private void CreateMenu()
{
foreach (Tuple<WebLinks> wl in WebLinksList)
{
contextMenuStripMain.Items.Add(wl.Item1.Name);
}
contextMenuStripMain.Items.Add("-");
contextMenuStripMain.Items.Add("Settings");
contextMenuStripMain.Items.Add("Exit");
}
以上工作正常,但没有任何分组,所以我需要在某个地方的 "wl.Item1.Group" 中工作,但 google 对我的情况没有帮助。
我累了 This Stack Overflow 它给了我重复的组,我试图过滤它但没有运气。希望我说得有道理。
您可以使用 LINQ 对对象进行分组:
private void CreateMenu()
{
foreach (var group in WebLinksList.GroupBy(wl => wl.Item1.Group))
{
var groupItem = new ToolStripMenuItem(group.Key);
contextMenuStripMain.Items.Add(groupItem);
groupItem.DropDownItems.AddRange(group.Select(w => new ToolStripMenuItem(w.Item1.Name)).ToArray<ToolStripItem>());
}
contextMenuStripMain.Items.Add("-");
contextMenuStripMain.Items.Add("Settings");
contextMenuStripMain.Items.Add("Exit");
}
因此,对于每个不同的 Group
,将添加一个菜单项。 Name
.
[编辑] 我现在将 groupItem
创建为 ToolStripMenuItem
并将子项目添加到 DropDownItems
属性.
谢谢 René Vogt。我在阅读您的回答之前确定了 if,但无论如何还是决定接受您的回答。
这是您的解决方法,我刚刚为子菜单添加了一个点击事件。
foreach (var group in WebLinksList.GroupBy(wl => wl.Level))
{
var groupItem = new ToolStripMenuItem(group.Key);
contextMenuStripMain.Items.Add(groupItem);
groupItem.DropDownItemClicked += Tm_DropDownItemClicked;
groupItem.DropDownItems.AddRange(group.Select(w => new ToolStripMenuItem(w.Name)).ToArray<ToolStripItem>());
}
这是我的修复,但它是一样的。
foreach (var group in WebLinksList.GroupBy(wl => wl.Level))
{
ToolStripMenuItem tm = new ToolStripMenuItem();
tm.Text = group.Key;
tm.DropDownItemClicked += Tm_DropDownItemClicked;
tm.DropDownItems.AddRange(group.Select(w => new ToolStripMenuItem(w.Name)).ToArray<ToolStripItem>());
contextMenuStripMain.Items.Add(tm);
}
反正没有你我也做不到。谢谢