我创建了一个测试项目,它重新创建了我在被告知要修复的程序中遇到的错误。您可以在http://tomsfreelance.com/stackoverflow/comboBox/查看它(代码在底部)
当我单击picturebox
第二个组合框的按钮并使用鼠标中轮向上滚动时,会发生以下错误。这里的关键点是必须选择第一个组合框 - 当您第一次启动应用程序时会发生这种情况。
此代码段中发生错误:
private void comboBox2_SelectedIndexChanged(object sender, EventArgs e)
{
if (comboBox2.SelectedIndex <= 0)
{
comboBox3.SelectedIndex = 0;
comboBox3.Items.Clear();
comboBox3.Enabled = false;
}
这是应用程序的作用:
- 当第一个组合框设置为它的第一个项目时,第二个组合框设置为它的第一个项目,它的项目被清除,然后它被禁用。
- 对于与第三个组合框相关的第二个组合框来说,情况也是如此。
现在,每个组合框都会监听事件SelectedIndexChanged
。因此,当第一个组合框更改为它的第一项时,第二个组合框设置为它的第一项。
如果在调试器中运行它,则必须启用错误断点,否则 VS 调试器将表现得好像没有任何问题一样。如果您运行独立的 exe,您将收到错误消息。
为什么会出现此错误消息?我可以通过删除选定的索引并在Items.Clear
. 不过,我更好奇为什么会这样。在我看来,同时拥有两个活动元素可能是 Windows 错误?(在这个糟糕的编程示例之上。)
这个问题是https://stackoverflow.com/questions/18150063/combo-box-scrolling-up-with-mouse-wheel-causes-error#comment26589550_18150063的后续问题
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace ComboBoxTest
{
public partial class Form1 : Form
{
public static int refillPrefix = 0;
public Form1()
{
InitializeComponent();
initComboBox();
comboBox1.SelectedIndex = 1;
comboBox2.SelectedIndex = 4;
comboBox3.SelectedIndex = 5;
}
public void initComboBox()
{
comboBox1.Items.Clear();
for (int x = 0; x < 15; ++x)
{
comboBox1.Items.Add("Test " + x.ToString());
}
}
public void fillCombo2()
{
comboBox2.Items.Clear();
for (int x = 0; x < 15; ++x)
{
comboBox2.Items.Add("Test " + refillPrefix.ToString() + "_" + x.ToString());
}
refillPrefix++;
}
public void fillCombo3()
{
for (int x = 0; x < 15; ++x)
{
comboBox3.Items.Add("Test " + refillPrefix.ToString() + "_" + x.ToString());
}
refillPrefix++;
}
private void comboBox1_Click(object sender, EventArgs e)
{
comboBox1.DroppedDown = !comboBox1.DroppedDown;
}
private void button1_Click(object sender, EventArgs e)
{
comboBox1.DroppedDown = !comboBox1.DroppedDown;
}
private void pictureBox1_Click(object sender, EventArgs e)
{
comboBox2.DroppedDown = !comboBox2.DroppedDown;
}
private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
if (comboBox1.SelectedIndex <= 0)
{
comboBox2.SelectedIndex = 0;
comboBox2.Items.Clear();
comboBox2.Enabled = false;
pictureBox1.Enabled = false;
}
else
{
fillCombo2();
comboBox2.Enabled = true;
pictureBox1.Enabled = true;
}
}
private void comboBox2_SelectedIndexChanged(object sender, EventArgs e)
{
if (comboBox2.SelectedIndex <= 0)
{
comboBox3.SelectedIndex = 0;
comboBox3.Items.Clear();
comboBox3.Enabled = false;
}
else
{
fillCombo3();
comboBox3.Enabled = true;
}
}
private void comboBox3_SelectedIndexChanged(object sender, EventArgs e)
{
}
}
}