DataGridView

#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());
    }
}
  

Проблема в том, что нет способа (который я могу придумать) получить правильные свойства ячейки, поэтому вам придется переоценить все столбцы, а не только столбец, содержащий изменение.