Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.04.2018, 19:33   #1
ольгаг
Форумчанин
 
Регистрация: 22.02.2010
Сообщений: 325
По умолчанию Изменение коллекции с привязанными данными

Здравствуйте Уважаемые программисты!
Подскажите пожалуйста, как в vs2010 c# winforms решить следующую задачу:
Есть класс, описывающий человека. Он содержит имя и по одному свойству на три Label-а:
Код:
public class Person
{
    public string Name { get; set; }

    public string Value1 { get; set; }
    public string Value2 { get; set; }
    public string Value3 { get; set; }
}
Создается коллекция, в которой хранятся работники:
Код:
List<Person> persons = new List<Person>();
Добавляются в неё все работники:
Код:
persons.Add(new Person { Name = "Вася" });
persons.Add(new Person { Name = "Маша" });
Привязывается коллекция к компоненту:
Код:
var listBox = ((ListBox)checkedListBox1);
listBox.DataSource = persons;
listBox.DisplayMember = "Name";
Делается привязка Label-ов к коллекции:
Код:
Label1.DataBindings.Add("Text", persons, "Value1");
Label2.DataBindings.Add("Text", persons, "Value2");
Label3.DataBindings.Add("Text", persons, "Value3");
В результате при выделении работника в checkedListBox1 его данные появляются в 3-х Label-ах (Label1, Label2, Label3). Но это работает только если в CheckedListBox1 сначала добавлены все работники, а затем выполнена привязка Label-ов.
Подскажите пожалуйста, как решить подобную задачу но с добавлением работников в CheckedListBox1 в любой момент. Т.е., например, в коллекцию добавлен 1 работник (одна строка в CheckedListBox1) (persons.Add(new Person { Name = "Вася" }); ), затем выполнена привязка этого работника к трем Label-ам (в этих Label-ах есть данные). Нужно добавить 2-го работника с 3-мя привязанными Label-ми, не потеряв значения Label-ов для 1-го работника. Как это сделать?
Заранее спасибо!

Последний раз редактировалось ольгаг; 15.04.2018 в 20:18.
ольгаг вне форума Ответить с цитированием
Старый 15.04.2018, 22:02   #2
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,520
По умолчанию

Вместо List использовать BindingList
pu4koff вне форума Ответить с цитированием
Старый 16.04.2018, 10:07   #3
ольгаг
Форумчанин
 
Регистрация: 22.02.2010
Сообщений: 325
По умолчанию

Подскажите пожалуйста, как в моем случае использовать BindingList, как изменить код? самостоятельно не получилось добиться нужного результата.
ольгаг вне форума Ответить с цитированием
Старый 16.04.2018, 10:19   #4
Скарам
Дружите с Linq ;)
Форумчанин
 
Аватар для Скарам
 
Регистрация: 15.10.2008
Сообщений: 822
По умолчанию

Если я все правильно понял, то как-то так.
Код:
using System;
using System.ComponentModel;
using System.Linq;
using System.Windows.Forms;

namespace BindingsDemo
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

            checkedListBox1.DataSource = VM.DataSource;
            checkedListBox1.DisplayMember = "Name";
            var nullValue = new Person { Name = "null", Value1 = string.Empty, Value2 = string.Empty, Value3 = string.Empty };
            checkedListBox1.DataBindings.Add( "SelectedItem", VM, "Focused", false, DataSourceUpdateMode.OnPropertyChanged, nullValue );
            label1.DataBindings.Add( "Text", VM, "Focused.Value1", false, DataSourceUpdateMode.OnPropertyChanged, nullValue );
            label2.DataBindings.Add( "Text", VM, "Focused.Value2", false, DataSourceUpdateMode.OnPropertyChanged, nullValue );
            label3.DataBindings.Add( "Text", VM, "Focused.Value3", false, DataSourceUpdateMode.OnPropertyChanged, nullValue );
        }

        private readonly PersonCollectionVM VM = new PersonCollectionVM();

        private void checkedListBox1_SelectedValueChanged( object sender, EventArgs e )
        {
            VM.Focused = checkedListBox1.SelectedItem as Person;
        }

        private void buttonAddNew_Click( object sender, EventArgs e )
        {
            var newval = VM.DataSource.AddNew();
            newval.Name = "New name " + VM.DataSource.Count;
            newval.Value1 = newval.Name + "1";
            newval.Value2 = newval.Name + "2";
            newval.Value3 = newval.Name + "3";
            VM.Focused = newval;
        }

        private void buttonRemove_Click(object sender, EventArgs e)
        {
            VM.DataSource.Remove( VM.Focused );
        }
    }

    internal class PersonCollectionVM : INotifyPropertyChanged
    {
        public PersonCollectionVM()
        {
            DataSource = new BindingList< Person >( new[] { new Person { Name = "Вася", Value1 = "1", Value2 = "2", Value3 = "3" }, new Person { Name = "Вася", Value1 = "12", Value2 = "22", Value3 = "32" } }.ToList() );
            Focused = DataSource[ 0 ];
        }

        private Person focused;

        public BindingList< Person > DataSource { get; }

        public Person Focused
        {
            set
            {
                if ( Equals( value, focused ) )
                    return;
                focused = value;
                OnPropertyChanged( "Focused" );
            }
            get => focused;
        }

        public event PropertyChangedEventHandler PropertyChanged;

        protected virtual void OnPropertyChanged( string propertyName )
        {
            PropertyChanged?.Invoke( this, new PropertyChangedEventArgs( propertyName ) );
        }
    }

    internal class Person
    {
        public string Name { set; get; }

        public string Value1 { get; set; }
        public string Value2 { get; set; }
        public string Value3 { get; set; }
    }
}
Не давай организму поблажки, каждый день тренируй его в шашки..
Скарам вне форума Ответить с цитированием
Старый 23.07.2018, 23:39   #5
ольгаг
Форумчанин
 
Регистрация: 22.02.2010
Сообщений: 325
По умолчанию

Спасибо!

Последний раз редактировалось ольгаг; 24.07.2018 в 08:16.
ольгаг вне форума Ответить с цитированием
Старый 24.07.2018, 08:53   #6
ольгаг
Форумчанин
 
Регистрация: 22.02.2010
Сообщений: 325
По умолчанию

Подскажите пожалуйста, почему не получается привязка?

Ошибка при запуске Form1:
Код:
public Form1()
        {
            InitializeComponent();

            checkedListBox1.DataSource = VM.DataSource;
            checkedListBox1.DisplayMember = "Name";
            var nullValue = new Person { Name = "null", Value1 = string.Empty, Value2 = string.Empty, Value3 = string.Empty };
            checkedListBox1.DataBindings.Add("SelectedItem", VM, "Focused", false, DataSourceUpdateMode.OnPropertyChanged, nullValue);
            label1.DataBindings.Add("Text", VM, "Focused.Value1", false, DataSourceUpdateMode.OnPropertyChanged, nullValue);
            label2.DataBindings.Add("Text", VM, "Focused.Value2", false, DataSourceUpdateMode.OnPropertyChanged, nullValue);
            label3.DataBindings.Add("Text", VM, "Focused.Value3", false, DataSourceUpdateMode.OnPropertyChanged, nullValue);
        }
Привязка к свойству или столбцу Value3 для DataSource невозможна.
Имя параметра: dataMember
ольгаг вне форума Ответить с цитированием
Старый 24.07.2018, 09:23   #7
ольгаг
Форумчанин
 
Регистрация: 22.02.2010
Сообщений: 325
По умолчанию

Цитата:
Сообщение от ольгаг Посмотреть сообщение
Привязка к свойству или столбцу Value3 для DataSource невозможна.
Имя параметра: dataMember
Спасибо, разобралась!
ольгаг вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
А нужны ли коллекции? hoz Общие вопросы .NET 8 02.04.2016 12:36
коллекции RAIDER_90 Общие вопросы по Java, Java SE, Kotlin 1 17.04.2012 22:02
коллекции Джава tanya_m43 Помощь студентам 1 28.01.2012 02:24
Коллекции van-ok Помощь студентам 0 25.12.2009 01:47
Коллекции Mike777 Общие вопросы Delphi 0 19.02.2007 11:38