Страницы

Поиск по вопросам

четверг, 9 апреля 2020 г.

BindingList и привязка данных

#c_sharp #net #winforms #list

                    
У меня есть лист в который я могу добавить\удалить какой-то объект , как сделать
чтобы на это событие сразу отреагировал ListBox? 
    


Ответы

Ответ 1



Надо привязать ListBox к коллекции // #r "System.Windows.Forms" using System.Windows.Forms; using System.ComponentModel; var bl = new BindingList() { 1, 2, 3 }; new Timer { Enabled=true, Interval=1000 } // для примера каждую секунду .Tick += (s, e) => bl.AddNew(); // добавляем новые элементы в bl var f = new Form(); var lb = new ListBox() { Parent = f, Dock = DockStyle.Fill, DataSource = bl // привязка ListBox к BindingList }; f.ShowDialog(); Если надо в ListBox выводить значение свойства, то в lb надо добавить ValueMember var lb = new ListBox() { DataSource = bl, ValueMember = "тут имя свойства"; }; Если в ListBox надо выводить изменения свойств объектов, то в объектах надо реализовать интерфейс INotifyPropertyChanged public class Data : INotifyPropertyChanged { // требуется для уведомления о изменении значения свойств. public event PropertyChangedEventHandler PropertyChanged = delegate {}; public int Id { get; internal set; } public long Value { get { return _Value; } internal set { if (_Value != value) { _Value = value; PropertyChanged(this, new PropertyChangedEventArgs("Value")); }}} long _Value = 0; } Работающий пример на c# тут. UPDATE в лист добавляю число 1, а в лист бокс должна вывестись не единица, а "Число 1" Проще всего сделать так class Data { public int Value { get; set; } public string Text { get { return "Число " + this.Value; } } } var bl = new BindingList() { new Data { Value = 1 } }; var lb = new ListBox() { Parent = f, DataSource = bl, ValueMember="Value", DisplayMember="Text" };

Ответ 2



Объявляем класс с данными: public class Person { public int Id { get; set; } public string Name { get; set; } } Создаем коллекцию объектов: var source = new BindingList() { new Person() { Id = 1, Name = "Ivan" } }; Настраиваем контрол и передаем ему данные: // свойство, которое будет отображаться listBox.DisplayMember = "Name"; // свойство, которое будет возвращаться в качестве значения выбранного айтема listBox.ValueMember = "Id"; listBox = source; После этого все изменения в source будут отображаться в контроле.

Ответ 3



Вам нужно воспользоваться ListControl.DataSource List someList = ...; listBox.DataSource = someList;

Комментариев нет:

Отправить комментарий