【发布时间】:2018-02-13 06:49:06
【问题描述】:
我有两个班级,每个班级都有自己的ContextMenuStrip。
由于可以从另一个对象访问每个对象,因此我想将一个对象的每个 ToolStripMenuItem 嵌入到其他对象的 DropDown 中 ContextMenuStrip。
对象的类型为 MAC 和 TCPIP
这是 MAC 的 sn-p ContextMenuStrip:
ContextMenuStrip cms = new ContextMenuStrip();
foreach (TCPIP ip in AssignedTCPIPentries) {
mi = new ToolStripMenuItem(ip.IP + " - " + ip.Hostname);
for (int t = 0; t < ip.SingleItemContextMenue.Items.Count; t++) {
mi.DropDown.Items.Add(ip.SingleItemContextMenue.Items[t]);
}
cms.Items.Add(mi);
}
我的问题是,如果我正在使用 TCPIP onbject 并正在访问 ContextMenuStrip,它会立即打开。 (按预期)
当我调用 MAC ContextMenuStrip 并希望将每个分配的 TCPIP 对象的每个 ContextMenuStrip.Item 嵌入到子菜单(如上面的代码中所示)时,需要 Ages(每个 TCPIP 对象大约 10 秒)才能完成(每个TCPIP 对象有 21 个 ToolStripMenuItems)。但为什么它的表现如此糟糕,我该如何避免呢?
TCPIP.SingleItemContextMenue 部分的片段:
public ContextMenuStrip SingleItemContextMenue {
get {
ContextMenuStrip cms = new ContextMenuStrip();
ToolStripMenuItem mi = new ToolStripMenuItem();
mi.Text = "IP Infos [" + IP + "]";
mi.Click += new EventHandler(showDetailedInformation);
mi.Image = Toolbox.Properties.Resources.Info_64;
cms.Items.Add(mi);
cms.Items.Add(new ToolStripSeparator()); // Horizontal line
mi = new ToolStripMenuItem("Copy IP [" + IP + "]");
mi.Image = Toolbox.Properties.Resources.Copy_64;
mi.Click += new EventHandler((ss, e) => general.copyStringIntoClipboard(ss, e, IP));
cms.Items.Add(mi);
//And some more...
return cms;
}
}
PS:foreach 在迭代 ContextMenuStrip.Items 时不起作用,因为枚举问题。但我也没有得到原因。但也许这与我的问题有关?
【问题讨论】:
-
只需使用相同的菜单并更改显示事件的菜单上的文本
-
@Slai 我不明白你的意思?请更详细地向我解释一下。谢谢
-
无需事先创建所有菜单和子菜单。它们可以在需要时动态创建......就像在子项鼠标悬停事件中一样
-
@Slai 好的,但子菜单不是事先创建的。这些是在调用时创建的动态部分,因为对象的属性可以在运行时更改,因此项目根本不会在 ContextMenuStrip 中创建。 (参见 TCPIP 代码 sn-p 中的 getter)
标签: c# performance clone