ここでは、リストボックスで選択されている項目(アイテム)を取得する方法、および、設定する方法を紹介します。しかしその前に、リストボックスの種類について説明します。
リストボックスには、一つの項目しか選択できないものと、複数の項目を選択できるものの2種類があります。これはリストボックスコントロールのSelectionModeプロパティで変更できます。デフォルトである、SelectionModeプロパティがOneの時は、1つの項目しか選択できません(以下、「単一選択リストボックス」と呼びます)。SelectionModeプロパティをMultiExtendedまたはMultiSimpleに変更することにより、複数項目を選択できるようになります(以下、「複数選択リストボックス」と呼びます)。
MultiExtendedとMultiSimpleの違いは、ユーザーがどのように複数項目を選択することができるかという方法の違いです。MultiExtendedの場合、エクスプローラなどでおなじみの、CtrlキーやShiftキーを使った方法で複数項目を選択することが出来ます。MultiSimpleの場合はこれらのキーが使えませんが、クリックやSpaceキーにより一つ一つの項目を選択できます。
SelectionModeプロパティにはNoneも指定できますが、この場合は、項目の選択ができなくなります。
単一選択リストボックスで選択されている項目を取得する方法は主に4つあり、それぞれ取得できる値が違います。
SelectedIndexプロパティを使えば、選択されている項目のインデックス番号を取得できます。インデックス番号は、一番上の項目が 0 で、その下が 1 となります。選択された項目がなければ、 -1 になります。
SelectedItemプロパティを使えば、選択されている項目をObject型で取得できます。つまり、選択されている項目があれば、「ListBox1.Items(ListBox1.SelectedIndex)」(C#では、「ListBox1.Items[ListBox1.SelectedIndex]」)と同じ値を返します。選択されている項目がなければ、Nothing(C#では、null)になります。
SelectedValueプロパティを使えば、DataSourceプロパティにデータソースが設定されている時に限り、選択されている項目のValueMemberプロパティで指定されている値を取得できます。ValueMemberプロパティとSelectedValueプロパティについて詳しくは、「DisplayMemberとValueMemberプロパティについて」をご覧ください。
Textプロパティを使えば、選択されている項目のリストボックスに表示されている文字列を取得できます。リストボックスに表示される項目のテキストは、通常はそのオブジェクトのToStringの値ですが、DisplayMemberプロパティで変更することができます。これについても詳しくは、「DisplayMemberとValueMemberプロパティについて」をご覧ください。
以下に、リストボックス(ListBox1)で選択されている項目の情報を表示する例を示します。
'選択されている項目のインデックス番号を表示する '一番上の項目は0。選択されていない時は-1。 Console.WriteLine("SelectedIndex:{0}", ListBox1.SelectedIndex) '選択されている項目を表示する Console.WriteLine("SelectedItem:{0}", ListBox1.SelectedItem) '選択されている項目の値を表示する Console.WriteLine("SelectedValue:{0}", ListBox1.SelectedValue) '選択されている項目のテキストを表示する Console.WriteLine("Text:{0}", ListBox1.Text)
//選択されている項目のインデックス番号を表示する //一番上の項目は0。選択されていない時は-1。 Console.WriteLine("SelectedIndex:{0}", ListBox1.SelectedIndex); //選択されている項目を表示する Console.WriteLine("SelectedItem:{0}", ListBox1.SelectedItem); //選択されている項目の値を表示する Console.WriteLine("SelectedValue:{0}", ListBox1.SelectedValue); //選択されている項目のテキストを表示する Console.WriteLine("Text:{0}", ListBox1.Text);
複数選択リストボックスの場合は、SelectedIndicesプロパティ、または、SelectedItemsプロパティを使用します。SelectedIndicesプロパティは、選択されている項目のインデックス番号のコレクションを返します。SelectedItemsプロパティは、選択されている項目のコレクションを返します。
補足:これらのプロパティは単一選択リストボックスでも使用できます。逆に、先に紹介した、SelectedItem、SelectedIndex、SelectedValueプロパティを複数選択リストボックスで使用することもできますが、選択されている任意の項目を返すことになります。またTextプロパティは、最初に選択された項目を返します。
以下に、複数選択された項目の情報を表示する例を示します。
'選択されているすべての項目インデックス番号を取得する Console.WriteLine("選択されているすべてのインデックス番号:") Dim i As Integer For i = 0 To ListBox1.SelectedIndices.Count - 1 Console.WriteLine(" {0}", ListBox1.SelectedIndices(i)) Next '選択されているすべての項目を取得する Console.WriteLine("選択されているすべての項目:") For i = 0 To ListBox1.SelectedItems.Count - 1 Console.WriteLine(" {0}", ListBox1.SelectedItems(i)) Next
//選択されているすべての項目インデックス番号を取得する Console.WriteLine("選択されているすべてのインデックス番号:"); for (int i = 0; i < ListBox1.SelectedIndices.Count; i++) { Console.WriteLine(" {0}", ListBox1.SelectedIndices[i]); } //選択されているすべての項目を取得する Console.WriteLine("選択されているすべての項目:"); for (int i = 0; i < ListBox1.SelectedItems.Count; i++) { Console.WriteLine(" {0}", ListBox1.SelectedItems[i]); }
指定されたインデックスの項目が選択されているか調べるには、GetSelectedメソッドを利用します。
'0番目の項目が選択されているか調べる If ListBox1.GetSelected(0) Then Console.WriteLine("0番目の項目は選択されています。") End If
//0番目の項目が選択されているか調べる if (ListBox1.GetSelected(0)) { Console.WriteLine("0番目の項目は選択されています。"); }
インデックス番号を指定して項目を選択するには、SelectedIndexプロパティ、または、SetSelectedメソッドを使います。インデックス番号は、一番上の項目が 0 です。SetSelectedメソッドは、選択を解除するために使用することもできます。
DataSourceプロパティとValueMemberプロパティが設定されている時は、SelectedValueプロパティで項目を選択することもできます。該当する項目が見つからなければ、すべての選択がクリアされます。該当する項目が複数ある場合でも、最初に見つかった項目しか選択しません。ValueMemberプロパティとSelectedValueプロパティについて詳しくは、「DisplayMemberとValueMemberプロパティについて」をご覧ください。
リスト内の項目と同じ値を探して選択するには、SelectedItemプロパティを使います。該当する項目が見つからなければ、何もしません。該当する項目が複数ある場合でも、最初に見つかった項目しか選択しません。
リストに表示されている文字列を指定して項目を選択するには、Textプロパティを使います。該当する項目が見つからなければ、何もしません。該当する項目が複数ある場合でも、最初に見つかった項目しか選択しません。
複数選択リストボックスで複数の項目を選択する時は、通常、SetSelectedメソッドを使って項目を選択(あるいは、選択の解除を)します。しかしそれ以外の方法でも、それまでの選択状態を維持したまま新たな選択を追加するため、複数の項目を選択することができます。なお、それまでの選択状態を全てクリアする場合は、ClearSelectedメソッドを使います。
以下に、これらの方法を使って項目を選択する例を示します。
'リストボックスの選択をクリアする ListBox1.ClearSelected() 'インデックスが1~3の項目を選択する For i As Integer = 1 To 3 ListBox1.SetSelected(i, True) Next 'インデックスが2の項目の選択を解除する ListBox1.SetSelected(2, False) 'インデックスが5の項目の選択する ListBox1.SelectedIndex = 5 'リストボックス内に8(Int32型)があれば、最初の項目を選択する ListBox1.SelectedItem = 8 'リストボックス内にテキスト"10"の項目があれば、最初の項目を選択する ListBox1.Text = "10"
//リストボックスの選択をクリアする ListBox1.ClearSelected(); //インデックスが1~3の項目を選択する for (int i = 1; i <= 3; i++) { ListBox1.SetSelected(i, true); } //インデックスが2の項目の選択を解除する ListBox1.SetSelected(2, false); //インデックスが5の項目の選択する ListBox1.SelectedIndex = 5; //リストボックス内に8(Int32型)があれば、最初の項目を選択する ListBox1.SelectedItem = 8; //リストボックス内にテキスト"10"の項目があれば、最初の項目を選択する ListBox1.Text = "10";
注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。