こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

DataBindの更新タイミング(VB2005)

VB2005で、あるクラスのプロパティをテキストボックスのTextプロパティにDataBindingしています。
テキストボックスの内容とクラスの内部変数の値が同じになるようにしたいのですが、上手くいきません。

Public Class Class1
 Private _NameValue As String = Nothing
 Public Property NameValue() As String
  Get
   Return _NameValue
  End Get
  Set (ByVal value As String)
   _NameValue = Value
  End Set
 End Property
End Class

フォーム(Form1)にテキストボックス(TextBox1)とボタン(Button1)、ツールバーを設置しツールストリップボタン(ToolStripButton1)を設置します。

Public Class Form1
 Private c As Class1

 'フォーム表示時にClass1のインスタンス化、テキストボックスにバインディングする
 Private Sub Form1_Show (ByVal ・・・) Handles MyBase.Shown
  c = new Class1
  TextBox1.DataBinding.Add("Text", c, "NameValue")
 End Sub

 'Button1をクリックした時
 Private Sub Button1_Click(ByVal ・・・) Handles Button1.Click
  MessageBox.Show(c.NameValue)
 End Sub

 'ToolStripButton1をクリックした時
 Private Sub ToolStripMenu1_Click(ByVal ・・・) Handles ToolStripButton1.Click
  MessageBox.Show(c.NameValue)
 End Sub
End Class

デバッグを開始してテキストボックスに文字を打ち込み、Button1をクリックするとメッセージボックスに入力した文字が表示されます。
ですが、文字を打ち込みToolStripButton1をクリックすると文字を打ち込む前の状態の文字が表示されます。

なぜToolStripButtonの時は更新がされていないのでしょうか?
テキストボックスからTabキーでButton1へフォーカスを移動させてからToolStripButtonをクリックすると更新された正しい内容が表示されます。

実際のプログラム上ではデータベースへの書き込みなどを行っているのですが、うまく更新できない時があり調べたらこの症状に気づきました。

ツールボタンをクリックした時に、先にDataBindの更新が走るようにする方法はありませんか? 

投稿日時 - 2012-05-28 18:06:45

QNo.7501327

すぐに回答ほしいです

質問者が選んだベストアンサー

プロパティへの反映は,デフォルトではOnValidationになります。
このため,Validation系のイベントの発生しない*Strip系のコントロールではバインドは発生しません。

Site) Control validation events not fired when toolstrip button is clicked | Microsoft Connect
http://connect.microsoft.com/VisualStudio/feedback/details/117084/control-validation-events-not-fired-when-toolstrip-button-is-clicked
Site) ToolStripButtonを押すと他のコントロールの変更をコミットせずにイベント飛んでくる
http://social.msdn.microsoft.com/Forums/ja/csharpgeneralja/thread/6d547db3-5f0b-4b45-b11a-ad9d2d84c244

最初のMS ConnectフィードバックのMSからの回答を見るに,.NET 2.0 βのタイミングで既に認識はしているもののそういうデザインだ,ということみたいです。
Connectにあるように,ToolStripButtonを押したタイミングでFormのValidateを呼び出すのが簡単だと思います。

他に,プロパティへの反映をOnPropertyChangedにする方法もありますが,プロパティへの反映の回数が増えるので,この解決だけの為に使うのはお薦めしません。
# ユーザーの入力補助 (Enabled制御等) のために使うのであればよいと思いますが。

投稿日時 - 2012-05-29 02:20:11

お礼

>Validation系のイベントの発生しない*Strip系のコントロール
そんなコントロールがあったんですね。発生させない理由があるのでしょうが、初心者の私には
大きく躓いてしまいました。
ツールバーに保存や印刷、閉じるなどボタンを配置したのですが、こういう問題があるのであれば
ツールバーはやめて普通のボタンを置いて処理しようと思います。
大変勉強になりました。ありがとうございました。

投稿日時 - 2012-06-06 17:14:50

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(1)

あなたにオススメの質問