繁体   English   中英

从IEnumerable对象向ComboBox添加项目

[英]Add Items to ComboBox from an IEnumerable object

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

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

我该如何进行? 这是计时器事件中的代码。 这增加了很多倍,我不确定使用foreach,做到这一点foreach,也许IEnumareble接口具有更简单的方法。

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

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

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

每次读取所有项目都是一种不好的方法,但这是简单的方法。 如果代码允许,直接修改列表框(不要进行太多更新,不是太紧要时间),或者制作列表的副本并仅执行差异,则更好。 (步骤1:删除组合框中新列表中不存在的所有项目。步骤2:添加新列表中组合框中不存在的所有项目)

一个更简单的方法是:

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

所要做的就是清除comboBox并再次添加整个列表。 或者,如果您不喜欢清除comboBox:

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

您不再需要foreach 只需将所有代码替换为此!

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

更简单的方法是直接绑定到“人员”列表并适当设置DisplayMember ...

如果我绑定数据cmb.DataSource = personList; 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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM