0

私はこの同じ問題を主張しているbazillionの投稿を見てきたことを約束しますので、まだ私が困惑していることを私に許してください。VB.net DataRow.RowStateは更新されません

強く型付けされたデータセットを含むVS2008スマートデバイスプロジェクトがあります。ユーザーは、データセットに新しいレコードを作成するたびに、値を入力して保存することができます。ユーザーが値を編集したい場合は、行を編集するために入力可能な値を含む複数のコンボボックスがあるモーダル子フォームが表示されます。各コンボボックスは、以下の方法で、子フォームのコンストラクタにバインドされている:

With cmbSize 
     .DataSource = frmMain.dstConfig.Sizes 
     .DisplayMember = "Display" 
     .ValueMember = "Value" 
     .DataBindings.Add("SelectedValue", trowNewRow, "SIZE", True, DataSourceUpdateMode.OnPropertyChanged) 
End With 

dstConfig制約を含む表のデータセットです。ソースの表示と値のメンバーにバインドするとうまくいきます。

trowNewRowは、ユーザーが編集プロシージャを開始したときにメインフォームから伝達されたデータセットの行への参照です。行をパラメータ「ByRef」として渡すことによって、子フォームへの参照です。強タイピングは保存されます。私には、これが起きたときに気づいていない何らかの切り離しがあるかもしれません。私は、データセットに対して「選択」プロシージャを実行し、編集される行に対応する一意のIDフィールドでフィルタリングすることによって、参照を渡します。結果は、データセットと同じスキーマの厳密に型指定された行の単一項目配列で、最初の(そして唯一の)項目をオブジェクトとして渡します。

ユーザーが[OK]ボタンをクリックして変更を送信すると、変更が実際に実行されたかどうかを評価する手順がトリガされます。私がこれを行うと思った最良の方法は、trowNewRowのRowStateをチェックすることでした。ただし、RowStateは変更に関係なく「追加済み」のままです。行の値を手動でチェックすると、実際に変更が記録されたことを示します。私は、trowNewRowのAcceptChangesプロシージャが、自分のコードで明示的に呼び出されていないことを確認しました。

私は次のことを試してみました: 1)コンボボックスBindingManagerBaseは 4オブジェクト上EndCurrentEdit手順を呼び出す)を手動でコンボボックス 3にWriteValueを実行する)trowNewRow 2のEndEdit手順を呼び出します。 )上記のすべての組み合わせ

ありがとうございました任意のアイデアやソリューションです。

+1

これら2つの長い段落の代わりに関連するコードは、問題をよりよく説明し、退屈さを減らすかもしれません。 rowstateが追加されている場合は、dataadapterがデータベースをまだ更新していないことを意味します。それは新生であるため、保存するまで新しい行が残ります(編集/変更の回数に関係なく)。 – Plutonix

答えて

1

DataRowには2つのデータセット - オリジナルと現在 - が含まれ、RowStateにはそれらの関係が反映されます。元のデータは存在しないが、現在のデータがある場合、RowStateAddedです。 @Plutonixによると、現在のデータを編集する量は元のデータを追加することはないので、さらに変更を加えてもRowStateAddedのままです。現在のデータは存在しないが、元のデータがある場合、RowStateDeletedです。現在のデータが元のデータと一致する場合、RowStateUnchanged、それ以外の場合はModifiedとなります。

もしInsertCommandAdded行に対して実行され、データアダプタまたはテーブルアダプタにUpdateを呼び出すと、UpdateCommandModified行に対して実行され、DeleteCommandDeleted行に対して実行されます。保存に成功すると、アダプタは暗黙のうちにAcceptChangesを呼び出します。すべてのDeleted行がDataTableから削除され、現在の値がAddedModified行に元の値を上回り、RowStateUnchangedに変更されます。

したがって、RowStateは、最後にデータベースに保存してから変更を追跡するためのものです。これを使用して、各編集後にデータベースに変更を保存しない限り、ユーザーがUIで変更を行ったかどうかを判断することはできません。きめ細かな変更追跡が必要な場合は、それを自分で実装する必要があります。個人的には、私はそのような場合にはバインドしませんが、ユーザーがOKをクリックしてDataRowにデータをプッシュするまで待ちます。これにより、以前の編集内容を失うことなく最新の編集内容をキャンセルすることもできます。

関連する問題