データバインディングのおべんきょ。その9。
前回までのあらすじ
反映されていませんが、何か?
でしたね。ええ、書きなぐっていますとも。Text プロパティが変更されたのに Name プロパティに反映されませんでした。とっても切ないです。世の中切ないことばかりです。
ちゃっちゅっちょっと調べてきました。犯人は、お前↓だ!!
MSDN:Binding クラス (System.Windows.Forms)(http://msdn2.microsoft.com/ja-jp/library/system.windows.forms.binding(VS.80).aspx)
っていうか、自分が使おうとするクラスはちゃんとお勉強しておきましょうね。orz
今回の原因はこれ↓でした。
MSDN:Binding.DataSourceUpdateMode プロパティ(http://msdn2.microsoft.com/ja-jp/library/system.windows.forms.binding.datasourceupdatemode(VS.80).aspx)
プロパティは、バインドされたコントロール プロパティの変更がデータ ソースにいつ反映されるかを設定できます。このプロパティの型は
MSDN:DataSourceUpdateMode 列挙体(http://msdn2.microsoft.com/ja-jp/library/system.windows.forms.datasourceupdatemode(VS.80).aspx)
です。DataSourceUpdateMode プロパティの既定値は OnValidation ですのでデータソースへの変更の反映のタイミングは
コントロール プロパティが検証されると、データ ソースが更新されます。
ですね。プロパティの変更のタイミングとは違うということです。
これをプロパティの変更のタイミングに更新されるように前回のコードを以下のように変更します。
Imports System
Imports System.Windows.Forms
Public Class Form1
Private _person As Person
Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Load
Me._person = New Person
Dim b As New Binding("Text", Me._person, "Name")
b.DataSourceUpdateMode = DataSourceUpdateMode.OnPropertyChanged
Me.TextBox1.DataBindings.Add(b)
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As EventArgs) Handles Button1.Click
MessageBox.Show(Me._person.Name)
End Sub
Private Sub TextBox1_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged
MessageBox.Show(Me._person.Name)
End Sub
End Class
では、さっそく実行してみましょう♪TextBox1 に'abcde' と入力(直接入力で)して 出力結果をみてください。a、b、c・・・と入力した内容が、_person の Name プロパティに反映され(MessageBoxに表示され)ますか?
ふぁんたすてぃっく♪
# もしかしたらMessageBoxに表示される内容は、タイミング的に1つズレるかもしれません。これは
Form1 のTextChanged ハンドラ と Binding クラスのハンドラの実行順序によるものだと思っていますが、 間違っていましたら、ご意見ご指摘お願いします。m(_ _)m
ちなみに、
MSDN:Binding.ControlUpdateMode プロパティ(http://msdn2.microsoft.com/ja-jp/library/system.windows.forms.binding.controlupdatemode(VS.80).aspx)
ってのもあります。このプロパティは逆にデータ ソースの変更が、バインドされたコントロール プロパティにいつ反映されるかを設定できます。
このプロパティの型は
MSDN:ControlUpdateMode 列挙体(http://msdn2.microsoft.com/ja-jp/library/ms158470(VS.80).aspx)
です。規定値は OnPropertyChanged ですので、
データ ソース値が変更されるか、データ ソースの位置が変更されると、バインド コントロールが更新されます。
ですね。このように変更の通知とその反映のタイミングも制御できるなんて
とぉ~~~~~~~~~~~っても便利ですね♪
というお話でした。次回はその4でどっかで書きますって書いてた部分を書こうかなと思っています。(まだなにも考えてません・・・。)