#c# #winforms #datagridview
#c# #winforms #datagridview
Вопрос:
У меня есть datagridview с источником данных, установленным на myBindingList. Элементы списка реализуют INotifyPropertyChanged, поэтому datagridview автоматически реагирует на изменения в списке.
Теперь мне нужно вычислить некоторые сводки столбцов datagridview.
Это должно быть сделано, когда:
- изменения источника данных (OnDataSourceChanged)
- изменяется значение ячейки (OnCellValueChanged)
Первый понятен, но у меня небольшая проблема со вторым.
OnCellValueChanged срабатывает, когда пользователь изменяет значение ячейки с помощью control или on:
myDataGridView.Rows[x].Cells[y].Value=newValue;
но как насчет:
myBindingList[myInvoice].Property1=newValue;
DataGridView автоматически обновляется (INotifyPropertyChanged), но не запускает событие OnCellValueChanged .
Есть идеи, как я могу получить такую информацию из моего DataGridView? Это должно быть сделано на уровне DataGridView, потому что я пишу свой собственный элемент управления, который расширяет dgv.
Спасибо за помощь.
Ответ №1:
Лучший способ, который я могу придумать, чтобы решить эту проблему, — использовать BindingSource в качестве источника данных, а затем в вашем пользовательском DataGridView вызвать собственное событие в ответ на BindingSource.ListChanged
событие.
Я бы, вероятно, переопределил OnDataSourceChanged
что-то вроде этого:
public event EventHandler CustomCellValueChanged;
protected override void OnDataSourceChanged(EventArgs e)
{
bs = this.DataSource as BindingSource;
if (bs == null)
{
throw new ArgumentException("DataSource must be a BindingSource");
}
bs.ListChanged = new System.ComponentModel.ListChangedEventHandler(bs_ListChanged);
base.OnDataSourceChanged(e);
}
void bs_ListChanged(object sender, System.ComponentModel.ListChangedEventArgs e)
{
if (CustomCellValueChanged != null)
{
CustomCellValueChanged(this, new EventArgs());
}
}
Проблема в том, что нет способа (который я могу придумать) получить правильные свойства ячейки, поэтому вам придется переоценить все столбцы, а не только столбец, содержащий изменение.