在WinForms菜单中有一种批量更新的方法

Rob*_*Rob 2 c# performance menu winforms

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

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

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

"类似"代码在VB6项目中运行,执行操作所需的时间不到10秒.

Sim*_*one 5

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

示例代码:

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();
Run Code Online (Sandbox Code Playgroud)

我的邋machine机器上47毫秒.