|
.NET TIPS
リストボックスの各項目に値をひも付けるには?[C#、VB]
デジタルアドバンテージ 遠藤 孝信
2010/08/26 |
 |
|
Windowsフォームのリストボックスは、選択可能な複数の項目をリストで表示し、ユーザーにより選択された項目に基づいて何らかの処理を行うというのが基本的な動作だ。このとき、リストボックス内の各項目に関しては、表示されるテキストや、その項目が選択されたときに得られる値を、DisplayMemberプロパティおよびValueMemberプロパティにより制御できる。本稿では、これらのプロパティの使い方について簡単にまとめる。
以下ではリストボックスを使用した簡単なサンプル・プログラムを作成しながら解説していく。リストボックスに表示するサンプル・データとしては、Twitter(ツイッター)から取得した“つぶやき”を使用してみよう。まずは、そのためのメソッドを用意する。
データソースの準備
以下のリストは、Twitterからパブリック・タイムラインを取得し、配列として返すメソッドである。ここではLinqを使っているため、本稿のサンプル・プログラムを実行するにはVisual Studio 2008以降が必要だ。
System.Array getPublicTimeline()
{
string url = "http://twitter.com/statuses/public_timeline.xml";
var doc = System.Xml.Linq.XDocument.Load(url);
// Linq to XMLを使ってユーザー名とテキストのみを取得
var statuses =
from s in doc.Root.Descendants("status")
select new
{
UserName = s.Element("user").Element("name").Value,
Text = s.Element("text").Value
};
// クエリ結果を配列に変換して返す
return statuses.ToArray();
}
|
Function getPublicTimeline() As System.Array
Dim url As String = _
"http://twitter.com/statuses/public_timeline.xml"
Dim doc = System.Xml.Linq.XDocument.Load(url)
' Linq to XMLを使ってユーザー名とテキストのみを取得
Dim statuses = _
From s In doc.Root.Descendants("status") _
Select New With { _
.UserName = s.Element("user").Element("name").Value, _
.Text = s.Elements("text").Value _
}
' クエリ結果を配列に変換して返す
Return statuses.ToArray()
End Function
|
|
Twitterからパブリック・タイムラインを取得するメソッド(上:C#、下:VB) |
詳細は割愛させていただくが、このメソッドは、UserNameプロパティと、Textプロパティを持ったオブジェクト(以下、つぶやきオブジェクト)の配列を返す。各オブジェクトはTwitterの1つのつぶやきを示しており、それぞれのプロパティは、ユーザー名とつぶやきの内容にアクセスする。
Windowsフォームの作成
次にVisual Studioを開き、Windowsフォーム・アプリケーションのプロジェクトを新規作成する。そして次の画面のように、フォームにリストボックスとボタンとラベルを配置する。

|
ボタン、リストボックス、ラベルを配置したWindowsフォーム |
|
さらに、いま配置したボタンをダブルクリックし、以下のようなコードを記述して、ボタンがクリックされたときに、つぶやきオブジェクトの配列がリストボックスに表示されるようにする。
private void button1_Click(object sender, EventArgs e)
{
this.listBox1.DataSource = getPublicTimeline();
}
|
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Me.ListBox1.DataSource = getPublicTimeline()
End Sub
|
|
ボタンがクリックされたときに呼び出されるイベント・ハンドラ(上:C#、下:VB) |
また、配置したリストボックスをダブルクリックし、以下のようなコードを記述して、現在選択されている項目の値がラベルに表示されるようにしておく。
private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
{
this.label1.Text = listBox1.SelectedValue.ToString();
}
|
Private Sub ListBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ListBox1.SelectedIndexChanged
Me.Label1.Text = Me.ListBox1.SelectedValue.ToString()
End Sub
|
|
リストボックスの項目が選択されたときに呼び出されるイベント・ハンドラ(上:C#、下:VB) |
このように「現在選択されている項目の値」は、リストボックスのSelectedValueプロパティから取得できる。ちなみに、現在選択されている項目のインデックス番号はSelectedIndexプロパティから取得できる。
サンプル・プログラムの実行結果
さて、この段階でプログラムを実行すると、次のような画面となる。ここではボタンをクリックしてつぶやき一覧を表示し、さらにリストボックスで項目を選択したところだ。

|
サンプル・プログラムの実行結果 |
|
ここまでのように、特に何も設定を行っていない場合には、リストボックスの項目は、その項目のオブジェクトを文字列化して得られた文字列(=ToStringメソッドの戻り値)が表示される。上記の画面の「{ UserName = ……, Text = …… }」は、つぶやきオブジェクトに対してToStringメソッドを呼び出したときに返される文字列だ。
ラベルに表示される内容も同様だが、SelectedValueプロパティの値は、選択されている項目にひも付いている、つぶやきオブジェクトそのものである。
DisplayMemberプロパティとValueMemberプロパティの設定
ここからが本題だが、あらかじめリストボックスのDisplayMemberプロパティとValueMemberプロパティを設定しておくと、リストボックスに表示される文字列や、SelectedValueプロパティから得られる値を指定できる。これらには項目オブジェクトのプロパティの名前を指定する。
ここではリストボックスには、つぶやきオブジェクトのTextプロパティの内容を表示し、ラベルにはつぶやきオブジェクトのUserNameプロパティの内容を表示するために、次のようなコードを追加する。
private void button1_Click(object sender, EventArgs e)
{
listBox1.DataSource = getPublicTimeline();
listBox1.DisplayMember = "Text"; // 追加
listBox1.ValueMember = "UserName"; // 追加
}
|
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Me.ListBox1.DataSource = getPublicTimeline()
Me.ListBox1.DisplayMember = "Text" ' 追加
Me.ListBox1.ValueMember = "UserName" ' 追加
End Sub
|
|
ボタンのClickイベント・ハンドラ(上:C#、下:VB) |
再度プログラムを実行すると、画面表示は次のようになる。

|
リストボックスにDisplayMember/ValueMemberプロパティを設定 |
|
つぶやきオブジェクトのTextプロパティの内容がリストに表示され、項目選択時のSelectedValueプロパティからは、つぶやきオブジェクトのUserNameプロパティの内容が得られるようになった。
なお、Visual Studioのデザイン画面にある[プロパティ]ウィンドウからも、リストボックスのこれらのプロパティを設定可能だ。
カテゴリ:Windowsフォーム 処理対象:ListBoxコントロール
使用ライブラリ: ListBoxコントロール(System.Windows.Forms名前空間)
|
|
generated by
|
|