none
ListBoxのリストの選択状態を解除するタイミングとその方法 RRS feed

  • 質問

  • DataGridViewへの入力時に、3列目のデータはListBoxの項目を選択して入力することも可能にしています。

    この際に、次の行に移って3列目のデータを入力しようとすると、前の行で選択した状態がListBoxに残っています。
    このままでも全く不都合はないのですが、できるならば、以前の選択状態は解除しておきたいと思います。

    そこで、下のコードにあるように、listBox1.ClearSelected();をあちこちで試してみましたが、
    どの場合もListBoxから選択して入力した3列目のデータが消えてしまいます。
    private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
            {
                DataGridView dgv = (DataGridView)genkinDataGridView;
                string s = listBox1.Text;
                int iSelect = listBox1.SelectedIndex;
                int iRow = dgv.CurrentCell.RowIndex;
    
                dgv[3, iRow].Value = s;
                switch (iSelect)
                {
                    case 0:
                    case 2:
                    case 3:
                    case 5:
                        dgv.Select();
                        SendKeys.Send("{Tab}");
                        //listBox1.ClearSelected();
                        break;
                    case 1:
                    case 4:
                    case 6:
                        dgv.Select();
                        SendKeys.Send("{Tab}");
                        SendKeys.Send("{Tab}");
                        //listBox1.ClearSelected();
                        break;
                }
            }
    
            private void listBox1_Leave(object sender, EventArgs e)
            {
                //listBox1.ClearSelected();
            }

    zen73
    2009年9月26日 0:21

回答

  • そこで、下のコードにあるように、listBox1.ClearSelected();をあちこちで試してみましたが、
    どの場合もListBoxから選択して入力した3列目のデータが消えてしまいます。
    SelectedIndexChanged イベントがどのような時に起きるか確認して下さい。

    ListBox で何か選択したとき、選択が解除されたときのどちらでも発生するので、ClearSelected を実行すると選択が解除されて、SelectedIndexChanged が呼ばれて、listBox1.Text が空になっているにも関わらず、それを DataGridView に代入しているのでしょう。

    どこで選択を解除したところで現象は発生するので、「何の条件を満たしたときに 3 列目に値を代入するのか」ということをよく考えて下さい。
    なお、選択が解除されている場合、SelectedIndex は -1 になります。
    解決した場合は、参考になった返信に「回答としてマーク」のボタンを利用して、回答に設定しましょう(複数に設定できます)。
    • 回答としてマーク zen73 2009年9月26日 5:36
    2009年9月26日 3:43
    モデレータ

すべての返信

  • そこで、下のコードにあるように、listBox1.ClearSelected();をあちこちで試してみましたが、
    どの場合もListBoxから選択して入力した3列目のデータが消えてしまいます。
    SelectedIndexChanged イベントがどのような時に起きるか確認して下さい。

    ListBox で何か選択したとき、選択が解除されたときのどちらでも発生するので、ClearSelected を実行すると選択が解除されて、SelectedIndexChanged が呼ばれて、listBox1.Text が空になっているにも関わらず、それを DataGridView に代入しているのでしょう。

    どこで選択を解除したところで現象は発生するので、「何の条件を満たしたときに 3 列目に値を代入するのか」ということをよく考えて下さい。
    なお、選択が解除されている場合、SelectedIndex は -1 になります。
    解決した場合は、参考になった返信に「回答としてマーク」のボタンを利用して、回答に設定しましょう(複数に設定できます)。
    • 回答としてマーク zen73 2009年9月26日 5:36
    2009年9月26日 3:43
    モデレータ
  • 回答ではなく代案ですが(答は Azulean さんのレスの通りと思います)、3列目に DataGridViewComboBoxColumn
    クラスを使用してはいかがですか?

    DataGridViewComboBoxColumn クラス
    http://msdn.microsoft.com/ja-jp/library/system.windows.forms.datagridviewcomboboxcolumn.aspx

    2009年9月26日 4:46
  •     if (iSelect != -1) dgv[3, iRow].Value = s; 
    で、正しく動作するようになりました。
    Azureannさん、AurferWwwさん、ありがとうございました。

    zen73
    2009年9月26日 5:39