Добавить элементы в ComboBox из объекта IEnumerable - PullRequest
0 голосов
/ 15 марта 2011

У меня есть System.Timers.Timer, который обновляет мои компоненты приложения win form каждые 5 секунд.

У меня есть comboBox и глобальный список IEnumerable<Person>, который также обновляется за 5 секунд.Мне нужно добавить имя человека в выпадающий список.Если имя уже есть в списке, я не должен добавлять.

Как я могу продолжить?Вот код внутри события таймера.Это добавляет несколько раз, и я не уверен, что сделать это с foreach, возможно IEnumareble интерфейс имеет более простой способ.

foreach (Persons person in personsList)
{
  comboBox.Items.Add(person.Name);
}

Ответы [ 5 ]

2 голосов
/ 15 марта 2011

Если возможно, использование DataBinding обычно хорошо.WPF имеет еще более приятную привязку, позволяющую MVVM .WPF на самом деле вносит изменения, когда вы изменяете исходную коллекцию (в реальном времени) и не должны читать все на каждом проходе.

Чтение всех элементов на каждом проходе - плохой подход, но это простой выходБыло бы лучше либо напрямую изменить список, если это позволяет код (не слишком много обновлений, не слишком критично по времени), либо сделать копию списка и выполнять только различия.(Пропуск 1: удалить все элементы в выпадающем списке, которых нет в новом списке. Пропуск 2: добавить все элементы в новом списке, которых нет в выпадающем списке)

2 голосов
/ 15 марта 2011

Это одно из более простых решений этой проблемы, при условии, что вы используете .NET 3.5 или выше:

foreach(Person person in personsList)
{
    if(!comboBox.Items.Cast<string>().Contains(person.Name)) 
    {
        comboBox.Items.Add(person.Name);
    }
}

Если вы используете 3.0 или более раннюю версию, вам придется выполнитьискать себя:

foreach(Person person in personsList)
{
    bool contains = false;

    foreach(string item in comboBox.Items)
    {
        contains = string.Equals(item, person.Name);

        if(contains) break;
    }

    if(!contains) comboBox.Items.Add(person.Name);
}
1 голос
/ 22 декабря 2012

Более простой подход:

comboBox.Items.Clear();
comboBox.Items.AddRange(personsList.Select(p => p.Name));

Все, что делает, это очищает comboBox и снова добавляет весь список.Или, если вам не нравится очищать поле со списком:

comboBox.Items.AddRange(personsList.Where(p => !comboBox.Items.Cast<string>().Contains(p.Name)).Select(p => p.Name));   

Вам больше не нужно foreach.Просто замените весь свой код этим!

1 голос
/ 08 июня 2011

Если я связываю данные cmb.DataSource = peopleList; cmb.DisplayMember = "Тема"; Это не сработает

Это не сработало и для меня. После некоторых попыток найти это решение, может быть, оно кому-нибудь поможет:

   IEnumerable<ICustomer> customers = GetCustomers(); //fill Ienumerable object list
   _comboBox.DataSource = customers.ToList(); //convert it to list and it binds fine
   _comboBox.DisplayMember = "Name";          // field Name from ICustomer
   _comboBox.ValueMember = "CustomerID";      // field CustomerID from ICustomer
1 голос
/ 15 марта 2011

Пара подходов может состоять в том, чтобы пройтись по всем элементам в выпадающем списке, или вы можете отслеживать список имен, которые вы уже добавили.У вас есть какие-либо требования к производительности?

Проще было бы просто привязать непосредственно к списку людей и настроить свой DisplayMember соответствующим образом ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...