C#Winforms动态菜单条目

时间:2014-07-28 12:11:48

标签: c# winforms dynamic menu toolstripmenu

我正在尝试在程序中创建动态菜单条。以下是现在的示例:

Image

动态创建ToolstripMenuItems很容易。我打算做的是检查当前月份是否已存在于我的程序使用的文件夹路径中,如果没有,那么它将创建一个带有日期的额外菜单条(例如,一旦我们打到八月,它应创建2014年8月,子项目“NL”和“PL”)。

然而,我所坚持的部分是如何将功能链接到这些动态创建的子项。由于我无法找到这样做的方法,“NL”和“PL”选项卡都会打开特定月份的特定.TXT文件(在程序的其他位置创建)。然而,当我动态制作它们时,我找不到让它们这样做的方法,它们只是没有任何功能。

此时我发现自己手动创建新的菜单项&每个月的代码。而且我非常希望程序能够自行运行。

有关如何使动态菜单项正常运行的任何提示?

添加了代码:

    private void CreateMenu()
    {
        ToolStripMenuItem item = new ToolStripMenuItem();
        item.Text = "Logs";
        DirectoryInfo dir = new DirectoryInfo(@"Y:\Heineken\Tools\Logs\");

        foreach (DirectoryInfo directory in dir.GetDirectories())
        {
            ToolStripMenuItem dateItem = new ToolStripMenuItem(directory.Name);
            ToolStripMenuItem NLMenu = new ToolStripMenuItem("NL"); // <--- This needs to open a specific text file on a network share
            ToolStripMenuItem PLMenu = new ToolStripMenuItem("PL"); // <--- This needs to open a specific text file on a network share
            dateItem.DropDownItems.Add(NLMenu);
            dateItem.DropDownItems.Add(PLMenu);
            item.DropDownItems.Add(dateItem);
        }
        menuToolStripMenuItem.DropDownItems.Add(item);

    }

2 个答案:

答案 0 :(得分:1)

如果您要发布一些动态创建菜单项的代码片段会有所帮助。通常,只需将委托传递给ToolStripMenuItem构造函数,就可以将功能链接到动态菜单条目,如下所示:

var entry = new ToolStripMenuItem("NL", null, delegate
{
    //TODO: do something
});

owner.DropDownItems.Add(entry);

这假设变量&#34; owner&#34;是您的父菜单条目。

编辑:根据您提供的代码,您可以这样做

private void OpenTextFile(string id)
{
    //TODO: logic for opening the shared file
}

private void CreateMenu()
{
    ToolStripMenuItem item = new ToolStripMenuItem();
    item.Text = "Logs";
    DirectoryInfo dir = new DirectoryInfo(@"Y:\Heineken\Tools\Logs\");

    foreach (DirectoryInfo directory in dir.GetDirectories())
    {
        ToolStripMenuItem dateItem = new ToolStripMenuItem(directory.Name);
        ToolStripMenuItem NLMenu = new ToolStripMenuItem("NL", null, (sender, e) => OpenTextFile("NL"));
        ToolStripMenuItem PLMenu = new ToolStripMenuItem("PL", null, (sender, e) => OpenTextFile("PL"));
        dateItem.DropDownItems.Add(NLMenu);
        dateItem.DropDownItems.Add(PLMenu);
        item.DropDownItems.Add(dateItem);
    }
    menuToolStripMenuItem.DropDownItems.Add(item);

}

答案 1 :(得分:0)

您需要将click事件处理程序连接到动态创建的ToolstripMenuItems。在点击事件处理程序中,您可以将sender转换为ToolstripMenuItem并访问您可能需要的任何属性,以确定需要加载的文本文件。

例如,此单击处理程序将给出一个消息框,其中包含菜单项的文本:

private void toolStripMenuItem_Click(object sender, EventArgs e)
{
    MessageBox.Show(((ToolStripMenuItem)sender).Text);
}

要添加新的动态菜单项并将其链接到点击处理程序,您可以执行以下操作:

ToolStripMenuItem newItem = new ToolStripMenuItem("Dynamic Option");
newItem.Click += toolStripMenuItem_Click;

existingToolStripMenuItem.DropDownItems.Add(newItem);

代码发布后修改

Tag property中单击菜单项时,您可以存储应该打开的文件。单击菜单项后,您可以根据Tag中的路径打开文件。

例如,在您的CreateMenu方法中,您需要执行以下操作:

ToolStripMenuItem NLMenu = new ToolStripMenuItem("NL");
//store the filename here for later
NLMenu.Tag = Path.Combine(dir.FullName, "nl.txt");
//attach the click handler
NLMenu.Click += toolStripMenuItem_Click;
//repeat for PLMenu...

然后在点击处理程序中,您可以执行此操作:

private void toolStripMenuItem_Click(object sender, EventArgs e)
{
    string filename = ((ToolStripMenuItem)sender).Tag;
    //do something with the file.
}