【问题标题】:Slow clonig of ContextMenuStrip.ItemsContextMenuStrip.Items 的缓慢克隆
【发布时间】:2018-02-13 06:49:06
【问题描述】:

我有两个班级,每个班级都有自己的ContextMenuStrip。 由于可以从另一个对象访问每个对象,因此我想将一个对象的每个 ToolStripMenuItem 嵌入到其他对象的 DropDownContextMenuStrip

对象的类型为 MACTCPIP 这是 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


【解决方案1】:

SingleItemContextMenue getter 在每次使用 ip.SingleItemContextMenue 时被调用

ContextMenuStrip cms = new ContextMenuStrip();
foreach (TCPIP ip in AssignedTCPIPentries) {
    mi = new ToolStripMenuItem(ip.IP + " - " + ip.Hostname);
    var ipSingleItemContextMenueItems = ip.SingleItemContextMenue.Items;     // get items

    for (int t = 0; t < ipSingleItemContextMenueItems.Count; t++) {
        mi.DropDown.Items.Add(ipSingleItemContextMenueItems[t]);
    }
    cms.Items.Add(mi);
}

【讨论】:

    猜你喜欢
    • 2015-09-23
    • 2015-12-06
    • 1970-01-01
    • 2013-03-23
    • 2010-10-22
    • 1970-01-01
    • 1970-01-01
    • 2019-03-02
    • 2018-02-02
    相关资源
    最近更新 更多