データバインディングのおべんきょ。その4。
データバインディングのおべんきょ。その10。
今回はその4でどっかで書きますって書いてた部分を書こうかなと思います。それは
さて、どんなオブジェクトがリストとしてバインディング可能なのでしょうか?なんとなく、配列とか、コレクションとかがイメージできますが、一般的には IList インターフェイス か IListSource インターフェイスをサポートしていることが必要なようです。(どっかで書きますが、例外もあります。)
でした。といっても「うわー!すっごい例外だね!!」ってワケではなくて、ちょっとした小咄程度です。
今回エントリで使用するクラスは、BindingSource クラスです。MSDNだと、こちら↓
MSDN:BindingSource クラス(http://msdn2.microsoft.com/ja-jp/library/system.windows.forms.bindingsource(VS.80).aspx)
MSDN:BindingSource コンポーネント(http://msdn2.microsoft.com/ja-jp/library/h974h4y2(VS.80).aspx)
この BindingSource クラスを使用すると、
何でもできちゃう気がするのですよ。(気のせいかもしれません。)
ええ、いろいろやってくれますよ。BindingSource クラスって。たとえば、
IEnumerable インターフェイスしか実装してなくてもバインドしたげるよ♪
MSDN:IEnumerable インターフェイス(http://msdn2.microsoft.com/ja-jp/library/system.collections.ienumerable(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
次に、IEnumerable インターフェイスを実装した以下のクラスを用意します。
Imports System.Collections
Imports System.Collections.Generic
Public Class WankumaEntertainerEnum
Implements IEnumerable
Private _entertainers As List(Of WankumaEntertainer)
Public Sub New()
Me._entertainers = New List(Of WankumaEntertainer)
End Sub
Public Sub Add(ByVal entertainer As WankumaEntertainer)
Me._entertainers.Add(entertainer)
End Sub
Public ReadOnly Property Count() As Integer
Get
Return Me._entertainers.Count()
End Get
End Property
Public Function GetEnumerator() As IEnumerator Implements IEnumerable.GetEnumerator
Return Me._entertainers.GetEnumerator()
End Function
End Class
内部で List(Of WankumaEntertainer) なフィールドを保持し、自分の IEnumerable.GetEnumerator は List(Of WankumaEntertainer) のGetEnumeratorを返して勘弁してもらおうというクラスです。後は要素を追加する Add メソッド と 要素数を取得する Count プロパティを書いておきました。
Imports System
Imports System.ComponentModel
Imports System.Windows.Forms
Public Class Form1
Private _entertainerEnum As WankumaEntertainerEnum
Private _entertainersBindingSource As BindingSource
Public Sub New()
InitializeComponent()
Me.components = New Container
Me._entertainersBindingSource = New BindingSource(Me.components)
End Sub
Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Load
Me._entertainerEnum = New WankumaEntertainerEnum
Me._entertainerEnum.Add(New WankumaEntertainer("ぽぴ王子"))
Me._entertainerEnum.Add(New WankumaEntertainer("アクア"))
Me._entertainerEnum.Add(New WankumaEntertainer("R・田中一郎"))
Me._entertainersBindingSource.DataSource = Me._entertainerEnum
Me.ComboBox1.DataSource = Me._entertainersBindingSource
Me.ComboBox1.DisplayMember = "Name"
End Sub
End Class
では、さっそく実行してみましょう♪ どうですか?リストの項目にお三方のお名前が表示されていますよね。
すんげー!すんげー!
いや~、すばらしい!さ、これでIEnumerable インターフェイスを実装したクラスによるデータバインディングのおべんきょはおしまい、めでたしめでたし♪
って、当たり前ですけどこのままでは終わりませんよ。
ええ、そうです。ちょっとこんなの試してみてください。デザイナから Form1 にButton を一つ追加して(Button1 で。)Form1 のコードに以下のように書き加えます。
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Me._entertainerEnum.Add(New WankumaEntertainer("とりこびと"))
End Sub
Button1 をクリックすると _entertainerEnum に 'とりこびと' という Name プロパティ に設定された WankumaEntertainer を追加するコードです。
ではでは、実行してみましょう。Button1 をクリックしてから ComboBox1 のリストを確認してみてください。
あれ?また 'とりこびと' いないYO!(まさか、このリストには入れない仕様なんじゃ・・・。)
そうです。_entertainerEnum に対して行った変更が反映されません。・・・困りましたね。
・・・と、困ったところで次回につ・づ・く♪
# セッションの用意しないと~。