トップ回答者
C#、リストボックスで複数選択

質問
-
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.SelectedItems+ "\r\n";
}
MessageBox.Show(str);
}CTRLキーでリストボックスのアイテムを複数選択した場合は、メッセージボックスに複数選択したアイテムすべてが表示されるのですが、
SHIFTキーや項目をドラッグして複数選択したときは、メッセージボックスには、選択したアイテムのうち最上部のアイテムしか表示されません。
原因が分からず困っています。
どなたかよろしくお願い致します。
回答
-
IIJIMAS様が書いておられるように、SelectedIndexChangedなどでは、うまくいきます。
Clickだと、キーボードからの操作も拾えませんので、SelectedIndexChangedなどにすると良いと思います。
ただ私も謎なのは、Clickの方が、うまく処理できているSelectedIndexChangedよりも後で処理されるにもかかわらず、
Shiftでの操作をうまく拾えないことです。
イベントハンドラの部分だけ抜粋しますが、たとえば、これですと、B→Aの順に表示されます。
Code Snippetprivate 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);
}
すべての返信
-
IIJIMAS様が書いておられるように、SelectedIndexChangedなどでは、うまくいきます。
Clickだと、キーボードからの操作も拾えませんので、SelectedIndexChangedなどにすると良いと思います。
ただ私も謎なのは、Clickの方が、うまく処理できているSelectedIndexChangedよりも後で処理されるにもかかわらず、
Shiftでの操作をうまく拾えないことです。
イベントハンドラの部分だけ抜粋しますが、たとえば、これですと、B→Aの順に表示されます。
Code Snippetprivate 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);
}