将菜单添加到menustrip c#并指定它们的代码
问题描述:
这类似于:How to add things to a menustrip programatically?,但我需要稍微不同的东西。将菜单添加到menustrip c#并指定它们的代码
我有一个winform,我正在创建窗体的新实例。但是,当我制作新窗体时,我还收集了当前窗体的所有实例,并使用菜单项填充“窗口”菜单以允许关闭窗口。因此,我不仅需要以编程方式将菜单添加到菜单栏中,还需要指定这些菜单的功能。那可能吗?
代码:
private void newWindowToolStripMenuItem_Click(object sender, EventArgs e)
{
var newForm = new Form1();
newForm.Show();
foreach (Form form in Application.OpenForms)
{
// add menu items under "Window" with the name of the window and the
// event handler to close that window, aka form.Close() I assume;
}
}
我想这样来做,这样我每次我创建一个新的窗口时间更新“窗口”菜单,使我的窗户,关闭的名单是准确的,没有任何奇怪的额外的东西。
答
添加“ItemClicked” -event您ContexMenuStrip菜单。 “ContextMenuStrip1”是此处使用的菜单的名称。你的代码编辑部分内容如下:
var newForm = new Form1() { Name = "myForm" };
newForm.Show();
foreach (Form form in Application.OpenForms)
{
// Add new menuitem with the name of the form, and save the reference to "Tag"-property
ToolStripMenuItem newItem = new ToolStripMenuItem() { Name = newForm.Name, Text = newForm.Name, Tag = newForm };
// Add the new item to the menu
contextMenuStrip1.Items.Add(newItem);
}
然后使“ItemClicked” -event:
private void contextMenuStrip1_ItemClicked(object sender, ToolStripItemClickedEventArgs e)
{
// Close the linked form, if it isn't disposed
if (!((Form)((ToolStripItem)e.ClickedItem).Tag).IsDisposed)
{
((Form)((ToolStripItem)e.ClickedItem).Tag).Close();
}
// Remove this menuitem from the menu
contextMenuStrip1.Items.Remove((ToolStripItem)e.ClickedItem);
}
答
您可以创建一个包含必填字段的类,并传递所需的数据。
public class MenuItemInfo
{
public string Text { get; set; }
public object Tag { get; set; }
public EventHandler Handler { get; set; }
}
var menuItems = new List<MenuItemInfo>
{
new MenuItemInfo
{
Text = "whatever",
Tag = whatever,
Handler = (o, s) =>
{
//Do whatever
}
}
};
ToolStripMenuItem toolStripMenuItem;
foreach (var mi in menuItems)
{
ToolStripMenuItem foo = new ToolStripMenuItem(mi.Text);
foo.Click += mi.Handler;
foo.Tag = mi.Tag;
toolStripMenuItem.DropDownItems.Add(foo);
}
这看起来确实不错,但我令人头大我的脑子试图找出如何我我要去实现它,因为我试图在现有的事件处理器中执行它: 'code' private void newWindowToolStripMenuItem_Click(object sender,EventArgs e) { var newForm = new Form1(); newForm.Show(); foreach(Application.OpenForms中的表单形式) { //添加带有代码的menuitems以关闭其中一个打开的窗口,替换现有的菜单项。 } }'code' –
很抱歉,我不明白。你解决了你的问题,或者你需要更多的帮助?如果您需要更多帮助,请使用更多信息编辑您的问题,更新代码等。 –