データバインディングのおべんきょ。その1。
これまでのあらすじ。
あ、あ、あれ? TextBox の方は 'とりこびと' じゃないぢゃん!(ToT)
なんとも切ないお話です。涙が止まりません。バインドしたデータそのものにプログラムコードから変更しても TextBox1 に反映されませんでした。
なんとかこの問題をズバッと解決したいところです。がんばりましょう。いろいろ調べた結果、.NET Framework 2.0 では、基本的な方法として2通りあるようです。.NET Framework 1.1(.NET Framework 1.0 は未確認)でもそのうちの1つが使えそうです。
ではまず、.NET Framework 1.1 でも使えちゃう方法から。さくっと書きます。
「'プロパティ名' + Changed」 イベントの提供
だそうです。えぇ、名前が決まってます。「プロパティの名前にChangedをつけたイベント」です。今回だとNameChanged イベントですね。イベントについては以下のリンクをどうぞ♪
MSDN:イベントとイベント ハンドラ(http://msdn2.microsoft.com/ja-jp/library/2z7x8ys3(VS.80).aspx)
MSDN:方法 : イベントをクラスに追加する(http://msdn2.microsoft.com/ja-jp/library/cwa28bw2(VS.80).aspx)
ま、とりあえずやってみましょう。前回使用した Person クラスの Name プロパティが変更されたということを通知するイベントの実装です。
Imports System
Public Class Person
Public Event NameChanged As EventHandler
Private _name As String = String.Empty
Public Property Name() As String
Get
Return _name
End Get
Set(ByVal value As String)
If _name = value Then
Exit Property
End If
_name = value
Me.OnNameChanged(New EventArgs)
End Set
End Property
Public Sub New()
End Sub
Protected Overridable Sub OnNameChanged(ByVal e As EventArgs)
RaiseEvent NameChanged(Me, e)
End Sub
End Class
なんだかコードがさくっと増えましたが、以下の部分が変更になっています。
Public Event NameChanged As EventHandler
この一行がイベントの宣言になります。
Set(ByVal value As String)
If _name = value Then
Exit Property
 End If
_name = value
Me.OnNameChanged(New EventArgs)
End Set
Name プロパティのSet の部分です。現在の値と設定される値を比較し、同じであれば設定しないように変更しました。また、違う値を設定すると、OnNameChanged
メソッドを呼び出します。
Protected Overridable Sub OnNameChanged(ByVal e As EventArgs)
RaiseEvent NameChanged(Me, e)
End Sub
OnNameChanged は 内部で NameChanged イベントを発生させます。RaiseEvent ステートメントです。
今回の作業はこれでおしまいです。早速実行してみてください。前回、Button2 をクリックすると内部で _person の Name プロパティを変更するようなコードになっていました。その Button2 をクリックして TextBox1 のText プロパティに 変更が反映されるか確認してみましょう。
みて!反映されてる!反映されてるよ!かぁちゃん!!
というわけで、「'プロパティ名' + Changed」 イベントの提供という方法でデータの変更をコントロールに通知する方法でした。
次回はもう一つの方法ですよね♪