【问题标题】:C# Creating ContextMenuStrip Sub Menus and items DynamicallyC# 动态创建 ContextMenuStrip 子菜单和项目
【发布时间】:2016-01-19 20:20:59
【问题描述】:

我有一个在数据库中生成动态表单数据的 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”中工作,但谷歌对我的情况没有帮助。

我厌倦了This Stack Overflow,它给了我重复的组,我试图过滤它但没有运气。希望我说得通。

【问题讨论】:

    标签: c# menu duplicates strip


    【解决方案1】:

    您可以使用 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 属性。

    【讨论】:

    • 非常感谢,我看到你在这里做了什么,但由于某种原因“groupItem.Items.AddRange”给出错误,ToolStripItem 不包含“项目”的定义并且没有扩展方法“项目。
    • @Psystec 是的,有一个错误。 Items.Add 返回一个不知道子项目的抽象 ToolStripItemToolStripMenuItem 有子项目,但命名为 DropDownItems 而不是 Items。更新了我的答案。
    • 谢谢你,你是最棒的。它就像一个魅力,我看到你需要一个子菜单的点击事件。
    【解决方案2】:

    感谢勒内·沃格特。如果在阅读您的答案之前,我已修复,但无论如何还是决定选择您的答案。

    这是你的修复,我刚刚为子菜单添加了一个点击事件。

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

    无论如何,如果没有你,我是不会做到的。谢谢

    【讨论】:

    • 我忘了说我删除了列表中的元组,因为它不需要,因为我有一个可以处理它的类。
    猜你喜欢
    • 2012-01-20
    • 2014-12-08
    • 1970-01-01
    • 2021-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-14
    • 1970-01-01
    相关资源
    最近更新 更多