前回までのあらすじ
ユー、BindingList でやっちゃいなよ。
さて、そんな感じで List クラスでのデータバインディングをほっぽりだしていましたが、
データバインディングのおべんきょ。その4。
に戻って、List クラスでバインドをやっちゃう方法を書きます。以前も書きましたが、List クラス単独では難しそうですので、ちょっくら調べてきました。
今回から数回のエントリで使用するクラスは、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)
とりあえず、大きいクラスです。あ、気持ち的にですけどね。なので、今回はList クラスでバインドをやっちゃう部分だけ書きますね。
今回は見てもらったほうが分かりやすいので先にコードをすべてお見せします。
Imports System
Imports System.Windows.Forms
Public Class Form1
Private _entertainerList As List(Of WankumaEntertainer)
Private _entertainersBindingSource As BindingSource
Public Sub New()
InitializeComponent()
Me.components = New System.ComponentModel.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._entertainerList = New List(Of WankumaEntertainer)
Me._entertainerList.Add(New WankumaEntertainer("ぽぴ王子"))
Me._entertainerList.Add(New WankumaEntertainer("アクア"))
Me._entertainerList.Add(New WankumaEntertainer("R・田中一郎"))
Me._entertainersBindingSource.DataSource = Me._entertainerList
Me.ComboBox1.DataSource = Me._entertainersBindingSource
Me.ComboBox1.DisplayMember = "Name"
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Me._entertainersBindingSource.Add(New WankumaEntertainer("とりこびと"))
End Sub
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
For Each entertainer As WankumaEntertainer In Me._entertainerList
If entertainer.Name = "とりこびと" Then
entertainer.Name = "とりこびと(仮)"
End If
Next
Me._entertainersBindingSource.ResetBindings(False)
End Sub
End Class
さくっと内容を書きますと、
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._entertainersBindingSource.DataSource = Me._entertainerList
Me.ComboBox1.DataSource = Me._entertainersBindingSource
Me.ComboBox1.DisplayMember = "Name"
End Sub
この部分、見た感じ _entertainerList と ComboBox1 の間に _entertainersBindingSource を挟み込んだ感じになっていますね。
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Me._entertainersBindingSource.Add(New WankumaEntertainer("とりこびと"))
End Sub
_entertainerList に直接ではなく、_entertainersBindingSource に追加しています。
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
For Each entertainer As WankumaEntertainer In Me._entertainerList
If entertainer.Name = "とりこびと" Then
entertainer.Name = "とりこびと(仮)"
End If
Next
Me._entertainersBindingSource.ResetBindings(False)
End Sub
_entertainersBindingSource.ResetBindings メソッドの呼び出しです。これってその6でやった BindingList.ResetBindings と同じ感じっぽいですよね。
ではでは、実行してみてください♪Button1 をクリックして 'とりこびと' を追加し、Button2 をクリックして変更してみてください。でもってその後 ComboBox1 のリストを確認してみてください。
List クラスでもでけたでぇ!
どうやら BindingSource クラスは データとコントロールの仲を取り持ってくれているっぽいですね。データに直接ではなく、BindingSource に追加(Add メソッド)すると、ListChanged イベントを発生させてくれたり、ResetBindings メソッドをもってくれていたりととっても大助かりです。
理由あって IBindingList を実装できないクラスをバインドしたいときなど、このクラスでさくっとできそうですね。