我有一个contextMenuStrip,它在数据库中生成动态表单数据。 数据库中的数据有一个组列,我想用它来为应用程序动态创建子菜单。 我的问题是它创建了重复的子菜单项,我希望它分组。
这是我的List和Constructor。
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; }
}
到目前为止,这是构建上下文菜单的工作代码,但我需要将其更改为Group视图,而不只是显示Name。
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");
}
以上工作正常,但没有任何分组,所以我需要在&#34; wl.Item1.Group&#34;在某个地方,谷歌在我的情况下没有帮助。
我累了This Stack Overflow它给了我重复的组,我试图过滤它但没有运气。希望我有道理。
答案 0 :(得分:0)
您可以使用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
属性。
答案 1 :(得分:0)
感谢RenéVogt。在我读完你的答案之前我已经修好了,但是我决定和你的一起去。
这是你的修复,我刚为子菜单添加了一个点击事件。
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);
}
无论如何,没有你,我不会这样做。感谢