C#动态创建ContextMenuStrip子菜单和项

时间:2016-01-18 15:45:07

标签: c# menu duplicates strip

我有一个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它给了我重复的组,我试图过滤它但没有运气。希望我有道理。

2 个答案:

答案 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);
        }

无论如何,没有你,我不会这样做。感谢