此代码适用于其他事件,但不适用于comboBox1_Layout
:
Console.WriteLine(comboBox1.Name + " has "+ comboBox1.Items.Count + " items. ");
if (comboBox1.Items.Count <= 0)
{
var xx = Enum.GetValues(typeof(PictureBoxSizeMode))
.Cast<PictureBoxSizeMode>().Select(x => x.ToString()).ToArray();
//xx = new[] { "111", "222", "333" };
Console.Write("Adding " + xx.Length + " items..");
comboBox1.Items.Clear();
comboBox1.Items.AddRange(xx);
Console.WriteLine(" now we have " + comboBox1.Items.Count + " items.");
}
输出
comboBox1有0个项目 添加5项..现在我们有5项。
comboBox1有5个项目。
您可以看到Layout
事件已执行两次,但AddRange
仅执行一次。
但 ComboBox
现在实际上包含 10 项目:
当然我测试了枚举,这是正确的,当然Clear
只是一个绝望的尝试解决这个问题,但无济于事。
注意:我知道滥用Layout
进行初始化是不正确的,对于一个严肃的项目我会创建初始化服务。但是对于快速和脏的测试,它是一种将GUI事件保持在一起的方法,缺少一个构造函数或Load
事件。这个难题不该怎么办呢,但效果如何发生?
在任何时候测试项目计数时,它正确地报告只有5个项目,当选择其中一个时,程序崩溃。所以它似乎是一个视觉故障,这个词在这里意味着'bug'..
另一方面,将ComboBox
设置为OwerDrawing
时,comboBox1_DrawItem
事件会被调用10次,在删除列表时报告索引0-9
。并且,正如预期的那样,当DrawItem
代码尝试访问Items
时,它会因IndexOutOfRange
异常而崩溃。