3

我正在尝试在我的程序中创建一个动态菜单条。这是它现在的样子的一个例子:

图片

创建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);

    }
4

2 回答 2

2

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

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

owner.DropDownItems.Add(entry);

这假定变量“所有者”是您的父菜单条目。

编辑:鉴于您提供的代码,您可以这样做

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

}
于 2014-07-28T12:30:15.980 回答
0

您需要将 click 事件处理程序连接到动态创建的ToolstripMenuItems. 然后,在 click 事件处理程序中,您可以将其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 您可以存储在属性中单击菜单项时应该打开的文件。然后单击菜单项时,您可以根据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.
}
于 2014-07-28T12:30:37.687 回答