【问题标题】:Add Items to ComboBox from an IEnumerable object从 IEnumerable 对象向 ComboBox 添加项目
【发布时间】:2011-03-15 17:10:22
【问题描述】:

我有一个System.Timers.Timer,它每 5 秒更新一次我的 win 表单应用程序组件。

我有一个组合框和全局 IEnumerable<Person> 列表,它也在每 5 秒内更新。 我需要将人名添加到组合框。如果名称已经在列表中,我不应该添加。

我该如何继续? 这是计时器事件中的代码。这会添加多次,我不确定使用foreach, 是否可以做到这一点,也许IEnumareble 接口有更简单的方法。

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

【问题讨论】:

  • 你可能想对数据绑定做一些研究
  • 如果我绑定数据 cmb.DataSource = peopleList; cmb.DisplayMember = "主题";这行不通
  • 为什么不直接清除 Items,然后 AddRange IEnumerable?

标签: c# combobox


【解决方案1】:

假设您使用的是 .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);
}

【讨论】:

    【解决方案2】:

    如果可能的话,使用DataBinding 通常会很好。 WPF 有更好的绑定允许MVVM。 WPF 实际上会在您修改原始集合(实时)时进行修改,并且不必每次都读取所有内容。

    每次都读取所有项目是一种不好的方法,但它是一种简单的方法。如果代码允许,最好直接修改列表框(更新不多,时间要求不高),或者复制列表并仅执行差异。 (通过 1:删除组合框中不存在于新列表中的所有项目。通过 2:添加新列表中不存在于组合框中的所有项目)

    【讨论】:

      【解决方案3】:

      有几种方法可以遍历组合框中的所有项目,或者您可以跟踪已添加的名称列表。您对性能有什么要求吗?

      更简单的方法是直接绑定到 Persons 列表并适当地设置您的 DisplayMember...

      【讨论】:

        【解决方案4】:

        如果我绑定数据 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
        

        【讨论】:

          【解决方案5】:

          更简单的方法是:

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

          所做的只是清除组合框并再次添加整个列表。或者,如果您不喜欢清除组合框:

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

          您不再需要foreach。只需用这个替换所有代码!

          【讨论】:

          • 我必须添加 .ToArray(),因为它说“无法从 'System.Collections.Generic.IEnumerable' 转换为 'object[]'”
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-06-28
          • 2021-10-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多