none
C#、リストボックスで複数選択 RRS feed

  • 質問

  • C#、リストボックスで複数選択する際、

    Ctrlキーを使って複数選択した場合は、複数のアイテムを取得できるのですが、

    Shiftキーや複数の項目をドラッグして複数選択した場合、選択はできるのですが、アイテムを取得することが出来ません。

     

    ソースコードは下記の通りです。

           private void Form1_Load(object sender, EventArgs e)
            {
                listBox1.Items.Add("aaa");
                listBox1.Items.Add("bbb");
                listBox1.Items.Add("ccc");
                listBox1.SelectionMode = SelectionMode.MultiExtended;

            }

            private void listBox1_Click(object sender, EventArgs e)
            {
                string str = "";
                ListBox.SelectedObjectCollection lsc = listBox1.SelectedItems;
                for(int i=0 ; i<listBox1.SelectedItems.Count;i++)
                {
                    str = str + listBox1.SelectedItemsIdea + "\r\n";
                }
                MessageBox.Show(str);
            }

     

    CTRLキーでリストボックスのアイテムを複数選択した場合は、メッセージボックスに複数選択したアイテムすべてが表示されるのですが、

    SHIFTキーや項目をドラッグして複数選択したときは、メッセージボックスには、選択したアイテムのうち最上部のアイテムしか表示されません。

    原因が分からず困っています。

    どなたかよろしくお願い致します。

    2007年8月28日 8:00

回答

  • たぶん処理がClickイベントハンドラに書いてあるからだと思います。
    Clickイベントの時点では項目が”選択”されていないのだと思います。

    SelectedIndexChangedイベントまたはSelectedValueChangedイベントのハンドラどちらか一方に処理を書いてみてください。

    または他のbuttonを作成して項目を選んだあと、buttonのClickイベントで処理するようにするとかどうでしょうか。

    2007年8月28日 8:31
  • IIJIMAS様が書いておられるように、SelectedIndexChangedなどでは、うまくいきます。

    Clickだと、キーボードからの操作も拾えませんので、SelectedIndexChangedなどにすると良いと思います。

    ただ私も謎なのは、Clickの方が、うまく処理できているSelectedIndexChangedよりも後で処理されるにもかかわらず、

    Shiftでの操作をうまく拾えないことです。

     

    イベントハンドラの部分だけ抜粋しますが、たとえば、これですと、B→Aの順に表示されます。

    Code Snippet

            private void listBox1_Click(object sender, EventArgs e)
            {
                string str = "";
                ListBox.SelectedObjectCollection lsc = listBox1.SelectedItems;
                for (int i = 0; i < listBox1.SelectedItems.Count; i++)
                {
                    str = str + listBox1.SelectedItems[i] + "\r\n";
                }
                MessageBox.Show("A:Click\r\n"+str);
            }

            private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
            {
                string str = "";
                for (int i = 0; i < listBox1.SelectedItems.Count; i++)
                {
                    str = str + listBox1.SelectedItems[i] + "\r\n";
                }
                MessageBox.Show("B:SelectedIndexChanged\r\n"+str);
            }

     

    2007年8月28日 9:08
  • メッセージボックスの表示は確かにB→Aですが

    各イベントハンドラの先頭にブレークポイントを置いてデバッグ実行すると

    A→Bの順で実行されている事が確認できます。

    メッセージボックスの表示がB→AになるのはA内のMessageBoxのメッセージループでBのイベントハンドラが

    呼び出されるためではないでしょうか。

     

    2007年8月28日 14:00
  •  

    早速のご回答、誠にありがとうございました。

    listBox1_SelectedIndexChangedイベントで、うまくいきました。

    今後ともよろしくお願い致します。
    2007年8月29日 7:02

すべての返信

  • たぶん処理がClickイベントハンドラに書いてあるからだと思います。
    Clickイベントの時点では項目が”選択”されていないのだと思います。

    SelectedIndexChangedイベントまたはSelectedValueChangedイベントのハンドラどちらか一方に処理を書いてみてください。

    または他のbuttonを作成して項目を選んだあと、buttonのClickイベントで処理するようにするとかどうでしょうか。

    2007年8月28日 8:31
  • IIJIMAS様が書いておられるように、SelectedIndexChangedなどでは、うまくいきます。

    Clickだと、キーボードからの操作も拾えませんので、SelectedIndexChangedなどにすると良いと思います。

    ただ私も謎なのは、Clickの方が、うまく処理できているSelectedIndexChangedよりも後で処理されるにもかかわらず、

    Shiftでの操作をうまく拾えないことです。

     

    イベントハンドラの部分だけ抜粋しますが、たとえば、これですと、B→Aの順に表示されます。

    Code Snippet

            private void listBox1_Click(object sender, EventArgs e)
            {
                string str = "";
                ListBox.SelectedObjectCollection lsc = listBox1.SelectedItems;
                for (int i = 0; i < listBox1.SelectedItems.Count; i++)
                {
                    str = str + listBox1.SelectedItems[i] + "\r\n";
                }
                MessageBox.Show("A:Click\r\n"+str);
            }

            private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
            {
                string str = "";
                for (int i = 0; i < listBox1.SelectedItems.Count; i++)
                {
                    str = str + listBox1.SelectedItems[i] + "\r\n";
                }
                MessageBox.Show("B:SelectedIndexChanged\r\n"+str);
            }

     

    2007年8月28日 9:08
  • メッセージボックスの表示は確かにB→Aですが

    各イベントハンドラの先頭にブレークポイントを置いてデバッグ実行すると

    A→Bの順で実行されている事が確認できます。

    メッセージボックスの表示がB→AになるのはA内のMessageBoxのメッセージループでBのイベントハンドラが

    呼び出されるためではないでしょうか。

     

    2007年8月28日 14:00
  •  

    早速のご回答、誠にありがとうございました。

    listBox1_SelectedIndexChangedイベントで、うまくいきました。

    今後ともよろしくお願い致します。
    2007年8月29日 7:02