.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のデザイン画面にある[プロパティ]ウィンドウからも、リストボックスのこれらのプロパティを設定可能だ。End of Article

カテゴリ:Windowsフォーム 処理対象:ListBoxコントロール
使用ライブラリ: ListBoxコントロール(System.Windows.Forms名前空間)

この記事と関連性の高い別の.NET TIPS
[WPF、Silverlight 2]リストボックスの幅全体に項目を表示するには?
コントロールの項目を高速に追加/変更/削除するには?
ListBoxコントロールのオーナー描画(高さ固定)により画像を一覧表示するには?
Windowsフォームでフォームのコレクションを使用するには?
[ASP.NET]DataGridコントロールに選択ボタンを追加するには?
このリストは、(株)デジタルアドバンテージが開発した
自動関連記事探索システム Jigsaw(ジグソー) により自動抽出したものです。
generated by

「.NET TIPS」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間