したがって、私はDataSet
を持っています。テスト目的のために、これは単一のDataTable
を含んでいます。これは、ID
とName
という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を返します、問題はのみ既存の行への変更を生じます。
HasChangesは、このレコードの編集が完了したことをデータセットに通知した後にのみ機能します。たとえば、DataGridViewで編集する場合、同じレコードを保持している限り、フィールドを変更するとfalseが返されます。別のレコードに移動すると、trueを返します。 EditBoxを使用しているので、別のレコードに移動することはできず、EndEditメソッドを呼び出すことによって完了したことを伝える必要があります。このメカニズムは、同じレコードの複数のフィールドを編集し、フィールドごとに一度にレコード全体を変更するのに便利です – GuidoG
実際に 'DataRow'の' EndEdit'メソッドがあるようです。単純に 'EndCurrentEdit'をグローバルに呼び出すのではなく、レコードごとにこれを行う理由がありますか?明確にするために、私はかなり異なるコントロールを取り扱っています。それぞれ異なるレコードを扱っています。保存ボタンは、保存ボタンが押されたときにのみ実行されます。 – Interminable
私は、グローバルなEndCurrentEdit()を、保存ボタンコードのコードの最初の行として使用しています。コード内のデータローの値を変更する他のメソッドでは、datarowのendsit()メソッドを呼び出します。 – GuidoG