Не обновляются данные в DataGridView в real-time

168
23 февраля 2019, 19:40

В продолжении к вопросу

По совету @tym32167 реализовал все через поток UI. Теперь же данные в DataGridView обновляются, но при добавлении они отобразятся, если только перезагрузить форму с таблицей. Как это можно исправить и реализовать всю работу по обновлению в режиме реального времени?

Модель

public class Contract : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;
    private string _id { get; set; }
    private DateTime _openDate { get; set; }
    private string _currency { get; set; }
    private string _duration { get; set; }
    private string _operation { get; set; }
    private decimal _purchase { get; set; }
    private string _result { get; set; }
    private decimal _approximatePrice { get; set; }
    private void NotifyPropertyChanged([CallerMemberName] string propertyName = "")
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
    public string Id
    {
        get { return _id; }
        set
        {
            _id = value;
            NotifyPropertyChanged();
        }
    }
    public DateTime OpenDate
    {
        get { return _openDate; }
        set
        {
            _openDate = value;
            NotifyPropertyChanged();
        }
    }
    public string Currency
    {
        get { return _currency; }
        set
        {
            _currency = value;
            NotifyPropertyChanged();
        }
    }
    public string Duration
    {
        get { return _duration; }
        set
        {
            _duration = value;
            NotifyPropertyChanged();
        }
    }
    public string Operation
    {
        get { return _operation; }
        set
        {
            _operation = value;
            NotifyPropertyChanged();
        }
    }
    public decimal Purchase
    {
        get { return _purchase; }
        set
        {
            _purchase = value;
            NotifyPropertyChanged();
        }
    }
    public string Result
    {
        get { return _result; }
        set
        {
            _result = value;
            NotifyPropertyChanged();
        }
    }
    public decimal ApproximatePrice
    {
        get { return _approximatePrice; }
        set
        {
            _approximatePrice = value;
            NotifyPropertyChanged();
        }
    }
}

Кнопка открытие формы с DataGridView

container = new UnityContainer();
container.RegisterInstance(new UIThreadWorker());
worker = container.Resolve<UIThreadWorker>();
var data = worker.PerformInUIThread(() => new BindingList<Contract>(_br.Contracts));
var wnd = worker.PerformInUIThread(() => container.Resolve<TradeHistoryView>());
worker.PerformInUIThread(() => wnd.SetData(data));
worker.PerformInUIThread(() => wnd.ShowDialog());

И метод приема данных и отображение формы

    private BindingList<Contract> Data;
    private DataGridView dg;
    public TradeHistoryView()
    {
        BeforeInitializeComponent();
        InitializeComponent();
        dg = new DataGridView() { Height = 1000,Width = 1000 };
        Controls.Add(dg);
    }
    public void SetData(BindingList<Contract> data)
    {
        Data = data;
        BindingSource bs = new BindingSource();
        bs.DataSource = Data;
        dg.DataSource = bs;
    }

Добавление и изменение данных стандартное для BindingList(Add(new Contract(){...}) и т.д.

UPD

Нашел тему с похожим вопросом, как видно выше у меня уже реализован BindingList и INotifyPropertyChanged, но они ничего не дают, кроме обновления уже имеющихся данных. Способ замены данных в DataSource при добавлении, так же ничего не дает... Использовал ObservebleCollection, тоже не дало результатов.

Может стоит использовать другой компонент для обновлений данных? Подскажите пожалуйста

UPD

Предложили использовать вот такую интересную коллекцию, вроде по коду все идеально, но по прежнему она не отрабатывает нужные мне данные

public sealed class TrulyObservableCollection<T> : ObservableCollection<T>
    where T : INotifyPropertyChanged
{
    public TrulyObservableCollection()
    {
        CollectionChanged += FullObservableCollectionCollectionChanged;
    }
    public TrulyObservableCollection(IEnumerable<T> pItems) : this()
    {
        foreach (var item in pItems)
        {
            this.Add(item);
        }
    }
    private void FullObservableCollectionCollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
    {
        if (e.NewItems != null)
        {
            foreach (Object item in e.NewItems)
            {
                ((INotifyPropertyChanged)item).PropertyChanged += ItemPropertyChanged;
            }
        }
        if (e.OldItems != null)
        {
            foreach (Object item in e.OldItems)
            {
                ((INotifyPropertyChanged)item).PropertyChanged -= ItemPropertyChanged;
            }
        }
    }
    private void ItemPropertyChanged(object sender, PropertyChangedEventArgs e)
    {            
        NotifyCollectionChangedEventArgs args = new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Replace, sender, sender, IndexOf((T)sender));
        OnCollectionChanged(args);
    }
}
READ ALSO
C# WPF не работает template button, которая в template window

C# WPF не работает template button, которая в template window

Есть окно с кастомным стилем и в стиле кнопка MinimizeButton с кастомным Template, который изменяет ее Background на extensions:ButtonExtensionHighlightedBackground когда IsMouseOver...

141
Рекурсия с шагом N+1 и N+3

Рекурсия с шагом N+1 и N+3

Требуется с помощью рекурсии определить можно ли из массива 1N, в котором лежать целые неотрицательные числа, получить сумму K, если можно...

162
Чтение данных из COM порта C# .Net

Чтение данных из COM порта C# .Net

Написал программу на микроконтроллере которая в порт посылает данные(4 константных значения типа int) через функцию sprintf, sprintf переводит интовое...

147
Как перевести текст HTML-страницы?

Как перевести текст HTML-страницы?

Приложение выполняет парсинг HTML страницыHTML страница имеет текст, картинки, таблицы и другое содержание

163