2つの同様のデータグリッドを保持するwinformに取り組んでいます。それぞれのデータソースは同じテーブルの別のインスタンスに設定されています。テスト目的のために、テーブルは異なるレコードと類似したレコードの両方を持ち、それぞれのレコードに異なるセルが入っています。データマージとリジェクトが意図した通りに動作しない
1 - Datatable.Mergeを呼び出すと、ターゲットテーブルに不足している行が取得されますが、最初の行には空のセルがソーステーブルの対応するセルから更新されません。
2ターゲットテーブルでDatatable.RejectChangesを呼び出すと、マージによって追加された行は削除されませんが、今回は最初の行の空のセルが問題のセルの対応するセルから正しく更新されます。私がマージするときに起こると思うソーステーブル。
テーブルを埋めるために使用される機能:
private bool OpenFile(Datatable table)
{
if (OFD.ShowDialog() == DialogResult.OK) // OFD is OpenFileDialog
{
if (UserPrompt.ShowDialog() == DialogResult.OK) // UserPrompt is a custom input dialog for user credentials
{
try
{
// code to fill table not shown for readability, works well anyway
table.AcceptChanges(); // otherwise all the records are deleted after RejectChanges, including the initial ones
return true;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Operation Canceled", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
return false;
}
マージ機能:
private void menuMerge1_Click(object sender, EventArgs e)
{
Table1.Merge(Table2, true);
if (MessageBox.Show("Table 2 merged to table 1. Save changes? Choosing no will cancel the merging.", "Keep or Discard Changes", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.OK)
Save(Table1); // saving to file, custom function
else Table1.RejectChanges();
}
のOpenFile関数が最初に呼び出されたが、その後、マージは、それはそれです。
私が試してみました:
- はDataGridViewのをリフレッシュします。
- DataGridViewのDataSourceをリセットします。
- マージ後にターゲットのAcceptChangesを呼び出します。
ありがとうございました!
私はより良いアプローチは、最初にユーザーに尋ねてから、他の方法ではなくマージすることです。大きなテーブルの貴重なプロセッサ時間を節約できます。 –
@Abdul Rehman Sayed:True。私はテーブルをマージする信頼できる方法を見つけるとすぐにこれを変更します:) – Frank