В продолжении к вопросу
По совету @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);
}
}
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Есть окно с кастомным стилем и в стиле кнопка MinimizeButton с кастомным Template, который изменяет ее Background на extensions:ButtonExtensionHighlightedBackground когда IsMouseOver...
Требуется с помощью рекурсии определить можно ли из массива 1N, в котором лежать целые неотрицательные числа, получить сумму K, если можно...
Написал программу на микроконтроллере которая в порт посылает данные(4 константных значения типа int) через функцию sprintf, sprintf переводит интовое...
Приложение выполняет парсинг HTML страницыHTML страница имеет текст, картинки, таблицы и другое содержание