データバインディングのおべんきょ。その5。
前回のあらすじ
うひぃ~!変化なし!!(ToT)
プログラムコードから_entertainerList の要素の変更に対して行った変更が反映されませんでした。はてはて、困ったもんです。
というわけで、今回はそれの解決を目指します。というか、調べた結果を書きますね。
前回やったように ListChanged イベントが発生すれば、変更は反映されるんじゃないか?、という推測のもとに ListChanged イベントを発生させる方法を探してきました。まず、一番てっとり早い方法です。
BindingList.ResetBindings メソッドの呼び出し。
MSDN:BindingList.ResetBindings メソッド(http://msdn2.microsoft.com/ja-jp/library/ms132702(VS.80).aspx)
種類が Reset の ListChanged イベントを発生させます。
まんまですね。「種類が Reset」の部分については以下のとおり、
MSDN:ListChangedType 列挙体(http://msdn2.microsoft.com/ja-jp/library/system.componentmodel.listchangedtype(VS.80).aspx)
より、Reset は
リストの大半部が変更されました。イベントを待機しているすべてのコントロールで、このリストから取得しているデータをすべて更新する必要があります。
です。
まま、やってみましょう♪前回の Form1 のコードを以下のように変更します。
Imports System
Imports System.Collections.Generic
Imports System.ComponentModel
Public Class Form1
Private _entertainerList As BindingList(Of WankumaEntertainer)
Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Load
Me._entertainerList = New BindingList(Of WankumaEntertainer)
Me._entertainerList.RaiseListChangedEvents = True
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
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._entertainerList.ResetBindings()
End Sub
End Class
早速実行してみてください。Button1 をクリックして 'とりこびと' を追加し、Button2 をクリックして変更してみてください。でもってその後 ComboBox1 のリストを確認してみてください。
でけた!でけたでぇ!
というわけで、BindingList.ResetBindings メソッドの呼び出しという方法で要素の変更に対して行った変更をコントロールに反映させる方法でした。
次回はもう一つ方法を書きますね。