2

我在我的应用程序中构建了一些动态上下文菜单,代码如下:

mi = new ToolStripMenuItem( caption ) { Tag = c, Enabled = true };
context_menu.Items.Insert( n, mi );
mi.Click += new EventHandler( ContextClick);

这很好用。但是,如果项目数量很大(比如 1000 个),则构建菜单可能需要几分钟时间。我意识到菜单中的 1000 项是不寻常的,但这里的问题是速度。对于组合框和列表框,有一个 BeginUpdate() / EndUpdate() 可以围绕这种操作放置。有菜单机制吗?

“类似”代码在 VB6 项目中运行,执行该操作只需不到 10 秒。

4

1 回答 1

5

使用 context_menu.Items.CopyTo 方法将当前菜单复制到缓冲区中。然后用 context_menu.Items.Clear() 清除当前集合。根据需要按您希望的顺序更新缓冲区(不会触发 UI 更新),然后使用 AddRange(buffer) 将它们放回原处。

示例代码:

Stopwatch sw = new Stopwatch();
sw.Start();

var items = new ToolStripItem[menuStrip1.Items.Count];
menuStrip1.Items.CopyTo(items, 0);

var itemList = new List<ToolStripItem>(items);

for (int i = 0; i < 1000; i++)
    itemList.Insert(2, new ToolStripMenuItem { Text = "Hello" + i.ToString() });

menuStrip1.Items.Clear();
menuStrip1.Items.AddRange(itemList.ToArray());

sw.Stop();
label1.Text = sw.ElapsedMilliseconds.ToString();

在我破旧的机器上用了 47 毫秒。

于 2013-10-30T13:00:48.633 回答