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;
        }
Другие вопросы по тегам