2016-07-29 12 views
0

したがって、私はDataSetを持っています。テスト目的のために、これは単一のDataTableを含んでいます。これは、IDNameという2つの列を持つSQL TABLEを返すクエリから生成されます。このテーブルには1つのレコードがあります。フォームのBindingContext EndCurrentEdit()メソッドを呼び出さない限り、行が変更されたときHasChanges()は常にfalseです

私は次のように結合することが、単一TextBoxを持っている:

Dim dv As System.Data.DataView = myDataSet.Tables("MyTable").AsDataView() 
dv.RowFilter = "ID=1" 

Dim dabi As New Binding("Text", dv, "Name") 
txtInput.DataBindings.Add(dabi) 

これはすべてのアプリケーションで素晴らしい作品! TextBoxにはDataSetの値が入力され、TextBoxに入力するとDataSetに格納された値が更新されます。

だから、私はTextBoxを作成して保存します。

私はmyDataSet.HasChanges()と呼んでいます。私は変更を加えても、Falseを返します。研究は、編集がまだ完了していないと信じていない行とは関係があると示唆していますが、これがどのように機能しているかについての良い情報源を見つけることができなかったため、

Me.BindingContext(myDataSet.Tables("MyTable")).EndCurrentEdit()

これはメソッドです:

はまた、私は次の行でmyDataSet.HasChanges()への呼び出しの前に置く場合HasChanges()は正しい値(変更なしのためFalse、変更のためのTrue)を返しますことを発見しましたある種のグローバルバインディングコンテキストのように見えるものが呼び出されています。私はこれで何もやっていないか、または "Begin Edit"メソッドなどを呼び出しました(研究はそのようなものが私的であり暗黙的に呼ばれることを示唆しています)。

ここで私の質問:何が起こっているのですか? HasChanges()にはその回線が必要なのはなぜですか?この行が必要なデータバインディングに何か問題がありますか?その行には予想外の副作用がありますか?

EDIT:新しい行がEndCurrentEdit()への呼び出しなしを追加している場合HasChanges()が正常にtrueを返します、問題はのみ既存の行への変更を生じます。

+0

HasChangesは、このレコードの編集が完了したことをデータセットに通知した後にのみ機能します。たとえば、DataGridViewで編集する場合、同じレコードを保持している限り、フィールドを変更するとfalseが返されます。別のレコードに移動すると、trueを返します。 EditBoxを使用しているので、別のレコードに移動することはできず、EndEditメソッドを呼び出すことによって完了したことを伝える必要があります。このメカニズムは、同じレコードの複数のフィールドを編集し、フィールドごとに一度にレコード全体を変更するのに便利です – GuidoG

+0

実際に 'DataRow'の' EndEdit'メソッドがあるようです。単純に 'EndCurrentEdit'をグローバルに呼び出すのではなく、レコードごとにこれを行う理由がありますか?明確にするために、私はかなり異なるコントロールを取り扱っています。それぞれ異なるレコードを扱っています。保存ボタンは、保存ボタンが押されたときにのみ実行されます。 – Interminable

+0

私は、グローバルなEndCurrentEdit()を、保存ボタンコードのコードの最初の行として使用しています。コード内のデータローの値を変更する他のメソッドでは、datarowのendsit()メソッドを呼び出します。 – GuidoG

答えて

0

EndCurrentEditを呼び出すと、IEditableObjectで行った変更が基になるデータソースに保存されます。

DataRowViewが呼び出され、基礎となるのDataRowへの変更をコミットし、編集セッションを終了することDataRowViewの通貨マネージャの原因EndEditEndCurrentEditを呼び出し、IEditableObjectを実装しているため。

また、バインド元を使用して位置を変更するか、グリッドの別の行をクリックして位置を変更すると、実際には通貨マネージャーの位置が変更されます。その場合はEndCurrentEditとなります。

変更をコミットするには、EndCurrentEditを直接的または間接的に呼び出す必要があります。

+0

あなたが言って以来、*これは、編集がまだ完了していないと考えている行とは関係がありますが、これについてはわかりません。 *これは、なぜあなたが 'EndCurrentEdit'を呼び出すべきかに関する公式のソース広告の説明を共有しようとしました。 –

+0

答えについての質問がある場合はお知らせください:) –

関連する問題