C1FlexGrid - Как обновить сетку из BindingSource, когда базовый IEnumerable меняет значения
У меня есть следующий объект POCO:
internal class StationEntity : INotifyPropertyChanged
{
private int _id;
private string _stationType;
private string _stationName;
[Obfuscation(Exclude = true)]
public int ID
{
get { return _id; }
set
{
if (value == _id) return;
_id = value;
OnPropertyChanged("ID");
}
}
[Obfuscation(Exclude = true)]
public string StationType
{
get { return _stationType; }
set
{
if (value == _stationType) return;
_stationType = value;
OnPropertyChanged("StationType");
}
}
[Obfuscation(Exclude = true)]
public string StationName
{
get { return _stationName; }
set
{
if (value == _stationName) return;
_stationName = value;
OnPropertyChanged("StationName");
}
}
public event PropertyChangedEventHandler PropertyChanged;
[NotifyPropertyChangedInvocator]
protected virtual void OnPropertyChanged(string propertyName)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
}
}
Я установил источник данных сетки как BindingSource и установил источник привязки следующим образом:
gridStations.AutoGenerateColumns = false;
stationEntityBindingSource.DataSource = _stations;
gridStations.DataSource = stationEntityBindingSource;
Обратите внимание, что _stations является List<StationEntity>
, Если я связываюсь напрямую с _stations, сетка не будет вызывать события удаления, но это происходит, когда я использую BindingSource. В моем удалении я перенумеровываю коллекцию:
private void gridStations_BeforeDeleteRow(object sender, C1.Win.C1FlexGrid.RowColEventArgs e)
{
if (e.Row < 0 || e.Row > _stations.Count)
{
e.Cancel = true;
return;
}
var row = gridStations.Rows[e.Row];
if (row.DataSource != null)
{
var _toDelete = row.DataSource as StationEntity;
}
}
private void gridStations_AfterDeleteRow(object sender, C1.Win.C1FlexGrid.RowColEventArgs e)
{
if (_toDelete.IsNotNull())
{
_stations.Remove(_toDelete);
var station = 1;
foreach (var item in _stations)
{
item.ID = station++;
}
stationEntityBindingSource.DataSource = null;
gridStations.Update();
stationEntityBindingSource.DataSource = _stations;
gridStations.Update();
_toDelete = null;
}
}
Даже после очистки DataSource от BindingSource и повторного его применения, сетка по-прежнему не показывает обновленные значения. Что я делаю неправильно?
1 ответ
Решение
if (_toDelete.IsNotNull())
{
_stations.Remove(_toDelete);
var station = 1;
foreach (var item in _stations)
{
item.ID = station++;
}
stationEntityBindingSource.DataSource = null;
gridStations.Update();
stationEntityBindingSource.DataSource = _stations;
//add this line
gridStations.DataSource = null;
gridStations.DataSource = stationEntityBindingSource;
_toDelete = null;
}