0

ここで難しい質問があります。Access テーブルによって (DataGrid.ItemsSource) が埋められている DataGrid があります。

ユーザーに追加の列を表示し、(再) 並べ替え時にこの列の変更を保持するベスト プラクティスは何ですか?

私の場合、追加の列は、ユーザーが編集したい DataGrid 内の行を選択するための CheckBoxColumn です。DataGrid を並べ替えると、チェックが消えます。

コード:

using (OleDbConnection connection = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + AppDomain.CurrentDomain.BaseDirectory + "Test.accdb"))
{
    string strDbCmd = "SELECT * FROM Table1";
    OleDbDataAdapter daOleDb = new OleDbDataAdapter(strDbCmd, connection);
    DataTable dtResult = new DataTable(); // this is actually a global
    daOleDb.FillSchema(dtResult, SchemaType.Source);
    daOleDb.Fill(dtResult);
    DataGrid1.ItemsSource = dtResult.DefaultView;
    DataGridCheckBoxColumn dgCol = new DataGridCheckBoxColumn();
    DataGrid1.Columns.Insert(0, dgCol);
}

後でそれを使用してデータベースを更新するため、dtResult (実際にはグローバル) を変更することはできません。

// Later on somewhere else:
OleDbDataAdapter daOleDb = new OleDbDataAdapter(strDbCmd, connection);
// [...]
daOleDb.Update(dtResult);

もちろん、すべてのチェックを bool 配列などに格納することもできますが、DataGrid の並べ替え時にチェックを設定しておく賢い解決策はありますか?

よろしくお願いします!

4

1 に答える 1

0

私は良い解決策を思いついたと思います:

DataTable に入力した後、bool 列を手動で追加します。

// [...]
daOleDb.Fill(dtResult);
DataColumn dtCol = new DataColumn("Bool", typeof(Boolean));
dtCol.DefaultValue = false;
dtResult.Columns.Add(dtCol);
dtCol.SetOrdinal(0);
DataGrid1.ItemsSource = dtResult.DefaultView;

これは「RowsChanged」イベントには影響せず、追加された列であるため、実行する前に

daOleDb.Update(dtResult);

単純に削除/削除できます(追加された列は、削除されてもChangesEventに影響しないため、違いはありません)

dtResult.Columns[0].Remove(); // or Columns.Delete(...)
于 2013-05-18T18:49:07.993 に答える