gpt4 book ai didi

c# - ToolStripItemCollection.AddRange 方法中的缺陷?

转载 作者:太空宇宙 更新时间:2023-11-03 13:21:34 31 4
gpt4 key购买 nike

我坚信 ToolStripItemCollection.AddRange 的实现是一个错误:

我制作了带有两个菜单的 Windows 窗体应用程序,每个菜单包含 2 个项目。

first menu

second menu

(对不起,我没有足够的声誉来发布图片)。

接下来,我实现按钮点击处理程序:

private void button1_Click(object sender, EventArgs e)
{
menu1.DropDownItems.AddRange(menu2.DropDownItems);
}

并抛出 System.ArgumentOutOfRangeException。

我非常好奇为什么会这样,我用 ILSpy 反编译了 ToolStripItemCollection 程序集。这是我看到的:

public void AddRange(ToolStripItemCollection toolStripItems)
{
if (toolStripItems == null)
{
throw new ArgumentNullException("toolStripItems");
}
if (this.IsReadOnly)
{
throw new NotSupportedException(SR.GetString("ToolStripItemCollectionIsReadOnly"));
}
using (new LayoutTransaction(this.owner, this.owner, PropertyNames.Items))
{
int count = toolStripItems.Count;
for (int i = 0; i < count; i++)
{
this.Add(toolStripItems[i]);
}
}
}

没有什么可担心的。让我们看看 ToolStripItemCollection.Add 方法:

public int Add(ToolStripItem value)
{
this.CheckCanAddOrInsertItem(value);
this.SetOwner(value);
int result = base.InnerList.Add(value);
if (this.itemsCollection && this.owner != null)
{
this.owner.OnItemAdded(new ToolStripItemEventArgs(value));
}
return result;
}

并最终进入 ToolStripItemCollection.SetOwner:

private void SetOwner(ToolStripItem item)
{
if (this.itemsCollection && item != null)
{
if (item.Owner != null)
{
item.Owner.Items.Remove(item);
}
item.SetOwner(this.owner);
if (item.Renderer != null)
{
item.Renderer.InitializeItem(item);
}
}
}

我们可以清楚地看到,在每个步骤中,for 循环从 toolStripItems 中删除项目。 MSDN 对 ToolStripItemCollection 实现的 IList 接口(interface)发表了评论:在连续元素的集合中,例如列表,被移除元素之后的元素向上移动以占据空出的位置。如果集合被索引,被移动的元素的索引也会更新。。结果,我们最终在错误的索引上访问了 toolStripItems 中的项目(第二个项目移到了位置 0)。我说得对吗?

最佳答案

不能 100% 确定问题是什么,但您可以通过将集合转换为数组(需要强制转换)来解决此问题:

menu1.DropDownItems.AddRange(menu2.DropDownItems.Cast<ToolStripItem>().ToArray());

您的版本抛出错误是因为当第一个菜单被添加到 DropDown 集合时,它会从它正在迭代的集合中删除,因此会出现 OutOfRangeException。

关于c# - ToolStripItemCollection.AddRange 方法中的缺陷?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23940789/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com