さて、前回まで単純バインディング(シンプル オブジェクトに対するバインド)についていろいろおべんきょしました。
今回から数回、Form に配置した ComboBox の項目にオブジェクトのリストをバインドする方法をおべんきょしたいと思います。
さて、どんなオブジェクトがリストとしてバインディング可能なのでしょうか?なんとなく、配列とか、コレクションとかがイメージできますが、一般的には IList インターフェイス か IListSource インターフェイスをサポートしていることが必要なようです。(どっかで書きますが、例外もあります。)
MSDN:IList インターフェイス(http://msdn2.microsoft.com/ja-jp/library/system.collections.ilist(VS.80).aspx)
MSDN:IListSource インターフェイス(http://msdn2.microsoft.com/ja-jp/library/system.componentmodel.ilistsource(VS.80).aspx)
先ほどの配列なんかも IList インターフェイスを実装していますね。このエントリでも .NET Framework にある既存の IList インターフェイスを実装したクラスを使用することにします。それってずばり!
List ジェネリック クラスです!(http://msdn2.microsoft.com/ja-jp/library/6sh2ey19(VS.80).aspx)
まんまな名前ですね。ま、なにはともあれやってみましょうか♪
まず、最初に Visual Studio 2005 を使用して Visual Basic で WindowsApplication プロジェクトを作成します。プロジェクト名は「WindowsApplication1」でいいです。するとご存知のとおり、Form1 クラスの作成までやってくれますね。その勝手に出来上がった Form1 に ComboBox を配置しておきます。(ComboBox1 でいいですよ。)
次に、WankumaEntertainer クラスを用意します。
Public Class WankumaEntertainer
Private _name As String = String.Empty
Public Property Name() As String
Get
Return _name
End Get
Set(ByVal value As String)
_name = value
End Set
End Property
Public Sub New()
End Sub
Public Sub New(ByVal name As String)
Me.Name = name
End Sub
End Class
こんな感じですね。
Form1 クラスには、以下の内容を記述します。
Imports System
Imports System.Collections.Generic
Public Class Form1
Private _entertainerList As List(Of WankumaEntertainer)
Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Load
Me._entertainerList = New List(Of WankumaEntertainer)
Me._entertainerList.Add(New WankumaEntertainer("ぽぴ王子"))
Me._entertainerList.Add(New WankumaEntertainer("アクア"))
Me._entertainerList.Add(New WankumaEntertainer("R・田中一郎"))
Me.ComboBox1.DataSource = Me._entertainerList
Me.ComboBox1.DisplayMember = "Name"
End Sub
End Class
Form1_Load メソッド で、_entertainerList に3つのリスト項目を追加し、ComboBox1 のDataSource プロパティに設定します。_entertainerList の項目である WankumaEntertainer クラスの Name プロパティが ComboBox1 の項目として表示されるように DisplayMember プロパティに Name プロパティの名前 'Name' を設定します。
では、さっそく実行してみましょう♪ どうですか?リストの項目に表示されていますよね。
ちょっとこれ、ちょ→すごくない?
いや~、すばらしい!さ、これでリストのデータバインディングのおべんきょはおしまい、めでたしめでたし♪
って、この流れはもしや!!
ええ、そうです。ちょっとこんなの試してみてください。デザイナから Form1 にButton を一つ追加して(Button1 で。)Form1 のコードに以下のように書き加えます。
Imports System
Imports System.Collections.Generic
Public Class Form1
Private _entertainerList As List(Of WankumaEntertainer)
Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Load
Me._entertainerList = New List(Of WankumaEntertainer)
Me._entertainerList.Add(New WankumaEntertainer("ぽぴ王子"))
Me._entertainerList.Add(New WankumaEntertainer("アクア"))
Me._entertainerList.Add(New WankumaEntertainer("R・田中一郎"))
Me.ComboBox1.DataSource = Me._entertainerList
Me.ComboBox1.DisplayMember = "Name"
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Me._entertainerList.Add(New WankumaEntertainer("とりこびと"))
End Sub
End Class
Button1 をクリックすると _entertainerList に新しく 'とりこびと' という Name プロパティ に設定された WankumaEntertainer を追加するコードです。
ではでは、実行してみましょう。Button1 をクリックしてから ComboBox1 のリストを確認してみてください。
あ、あ、あれ? 'とりこびと' いないぢゃん!(ToT)
そうです。プログラムコードから_entertainerListに対して行った変更が反映されません。・・・困りましたね。
・・・と、困ったところで次回につ・づ・く♪