C#WPF DataGrid(ItemsSource =数据库表) - 附加列:如何在(重新)排序DataGrid时保持更改?

时间:2013-05-18 09:39:32

标签: c# wpf datagrid itemssource

这里有一个棘手的问题: 我有一个由访问表填充的DataGrid(DataGrid.ItemsSource)。

为用户显示其他列并在(重新)排序时保留此列中的更改的最佳做法是什么?

在我的情况下,附加列是用户的CheckBoxColumn,用于选择他想要编辑的DataGrid中的那些行。如果对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进行排序时设置检查吗?

种类问候!

1 个答案:

答案 0 :(得分: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(...)