Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#Winforms动态菜单项_C#_Winforms_Dynamic_Menu_Toolstripmenu - Fatal编程技术网

C#Winforms动态菜单项

C#Winforms动态菜单项,c#,winforms,dynamic,menu,toolstripmenu,C#,Winforms,Dynamic,Menu,Toolstripmenu,我正试图在我的程序中创建一个动态菜单条。下面是一个关于它现在的样子的示例: 动态创建ToolstripMenuItems本身很容易。我计划做的是检查当前月份是否已经存在于我的程序使用的文件夹路径中,如果不存在,那么它将创建一个带有日期的额外菜单条(例如,当我们到达8月时,它应该创建2014年8月,带有子项“NL”和“PL”) 然而,我一直停留在如何将功能链接到这些动态创建的子项上。由于我一直找不到这样做的方法,“NL”和“PL”选项卡都会打开特定月份的特定.TXT文件(在程序的其他地方创建)。

我正试图在我的程序中创建一个动态菜单条。下面是一个关于它现在的样子的示例:

动态创建
ToolstripMenuItems
本身很容易。我计划做的是检查当前月份是否已经存在于我的程序使用的文件夹路径中,如果不存在,那么它将创建一个带有日期的额外菜单条(例如,当我们到达8月时,它应该创建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);

    }
private void CreateMenu()
{
ToolStripMenuItem项=新的ToolStripMenuItem();
item.Text=“日志”;
DirectoryInfo dir=newdirectoryinfo(@“Y:\Heineken\Tools\Logs\”);
foreach(dir.GetDirectories()中的DirectoryInfo目录)
{
ToolStripMenuItem dateItem=新的ToolStripMenuItem(directory.Name);

ToolStripMenuItem NLMenu=new ToolStripMenuItem(“NL”);//如果您能发布一些关于如何动态创建菜单项的代码片段,这会有所帮助。通常,您只需将委托传递到ToolStripMenuItem构造函数,即可将功能链接到动态菜单项,如下所示:

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

owner.DropDownItems.Add(entry);
这假设变量“owner”是您的父菜单项

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

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

}

您需要将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);
private void toolStripMenuItem_Click(object sender, EventArgs e)
{
    string filename = ((ToolStripMenuItem)sender).Tag;
    //do something with the file.
}
发布代码后编辑

您可以存储在
标记中单击菜单项时应打开的文件。然后单击菜单项时,您可以根据
标记中的路径打开文件

例如,在
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...
然后在单击处理程序中,可以执行以下操作:

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

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

您只需动态连接到所需的事件即可完成所需的操作。的文档甚至为您提供了一个示例。您好,我已经添加了当前用于构建菜单的代码。