修正するように言われたプログラムで発生しているエラーを再現するテスト プロジェクトを作成しました。http://tomsfreelance.com/stackoverflow/comboBox/で表示できます(コードは下部にあります)。
picturebox
2 番目のコンボ ボックスのボタンをクリックし、中マウス ホイールを使用して上にスクロールすると、次のエラーが発生します。ここでの重要な点は、最初のコンボ ボックスを選択する必要があるということです。これは、アプリケーションを最初に起動したときに発生します。
このスニペットでエラーが発生します。
private void comboBox2_SelectedIndexChanged(object sender, EventArgs e)
{
if (comboBox2.SelectedIndex <= 0)
{
comboBox3.SelectedIndex = 0;
comboBox3.Items.Clear();
comboBox3.Enabled = false;
}
アプリケーションの機能は次のとおりです。
- 最初のコンボ ボックスが最初の項目に設定されると、2 番目のコンボ ボックスが最初の項目に設定され、項目がクリアされてから無効になります。
- これは、3 番目のコンボ ボックスに関連して 2 番目のコンボ ボックスに当てはまります。
これで、各コンボ ボックスが event をリッスンしますSelectedIndexChanged
。したがって、最初のコンボ ボックスが最初の項目に変更されると、2 番目のコンボ ボックスが最初の項目に設定されます。
これをデバッガーで実行する場合は、エラー ブレークポイントを有効にする必要があります。そうしないと、VS デバッガーは何も問題がなかったかのように動作します。独立した exe を実行すると、エラー メッセージが表示されます。
このエラー メッセージが表示されるのはなぜですか? 選択したインデックスを削除し、有効にすると、エラー メッセージを修正できますItems.Clear
。しかし、なぜそれが起こっているのかについてはもっと興味があります。また、同時に2つのアクティブな要素を持つことは、Windowsのバグかもしれないと私には思えますか? (この悪いプログラミング サンプルの上に。)
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)
{
}
}
}