C # WPF DataGrid (ItemsSource = Таблица базы данных) - дополнительный столбец: как сохранить изменения при (повторной) сортировке DataGrid?

у меня есть хитрый вопрос: у меня есть 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?

С наилучшими пожеланиями!


person ray    schedule 18.05.2013    source источник


Ответы (1)


Думаю, я нашел хорошее решение:

После заполнения 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(...)
person ray    schedule 18.05.2013