0

修正するように言われたプログラムで発生しているエラーを再現するテスト プロジェクトを作成しました。http://tomsfreelance.com/stackoverflow/comboBox/で表示できます(コードは下部にあります)。

picturebox2 番目のコンボ ボックスのボタンをクリックし、中マウス ホイールを使用して上にスクロールすると、次のエラーが発生します。ここでの重要な点は、最初のコンボ ボックスを選択する必要があるということです。これは、アプリケーションを最初に起動したときに発生します。

このスニペットでエラーが発生します。

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のバグかもしれないと私には思えますか? (この悪いプログラミング サンプルの上に。)

ここに画像の説明を入力

この質問は、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)
        {

        }
    }
}
4

1 に答える 1

0

何も選択されていないのに、選択されたアイテムのインデックスを設定または使用しようとしている可能性がありますか?

ombobox.selecteditems.count を確認します。それが 0 の場合、ルーチンを終了します。これは、選択したインデックスが変更されたとき、またはアイテムの選択が解除されたときに、コンボ ボックス/リスト ボックスで発生します。あなたは基本的にすべての呼び出しをチェックしたいのですが、選択されたアイテムがない場合は、何も動作しません。呼び出しは 2 回発生する必要があります。2 回目の呼び出しでは、選択されたアイテムがあり、それらを使用できます。

于 2013-08-12T14:28:35.070 に答える