选中 CheckedListBox 中的项目,如果它存在于列表中

Set Item in CheckedListBox selected, if it is existend in a List

我有一个 CheckedListBox。作为数据源,我使用自己的 BindingList Class var dataSource3 = new BindingList<Modells.Person>();.

然后我按字母顺序对它们进行排序。

var sorteddataSource3 = new BindingList<Modells.Person>(dataSource3.OrderBy(x => x.lastname).ToList());

并绑定它们。

clbPerson3.DataSource = sorteddataSource3;
clbPerson3.DisplayMember = "lastname";
clbPerson3.ValueMember = "idPerson";

我自己的Class结构是这样的:

public class Person
{
    public int idPerson { get; set; }
    public string firstname { get; set; }
    public string lastname { get; set; }
    public string phonenumber { get; set; }
    public string mailadress { get; set; }
    public int idCompany { get; set; }
}

现在我有另一个 "Persons" 的列表,我从 RestRequest 获得:IRestResponse<List<Modells.Person>> selectedPersons = client.Execute<List<Modells.Person>>(request);

现在的任务是在 CheckedListBox sorteddataSource3.

中设置 selectedPersons 选中的人员

我此时的解决方案是:

for (int i = 0; i < selectedPersons.Data.Count; i++)
{
    if (selectedPersons.Data[i].idCompany.Equals(comboBox3.SelectedValue))
    {
        int index3 = clbPerson3.Items.IndexOf(selectedPersons.Data[i].idPerson);
        clbPerson3.SetItemChecked(index3, true);
    }
}

首先我检查此人是否显示在 CheckedListBox 中。 之后,我尝试获取此人的索引。这是我的错误。 index3 总是 -1.

我正在寻找一种解决方案来设置在 CheckedListBox 中选中的项目。

问题是,selectedPersons 中的对象可能与 sorteddataSource3 中的对象具有相同的值,但对象本身并不相同。您需要进行某种比较。一个非常简单的方法是 select sorteddataSource3 中也出现在 selectedPersons 中的项目(至少具有相同值的对象),然后迭代这些项目(对于这个例子,我假设, idPerson 是主键):

var selectList = sorteddataSource3.Where(s => selectedPersons.Data.Any(p => p.idPerson == s.idPerson)).ToList();

foreach(Person person in selectList)
{
    int index3 = clbPerson3.Items.IndexOf(person);
    clbPerson3.SetItemChecked(index3, true);
}

你的 clbPerson3.Items 是强类型的,每一项都是 Person 类型,你正在寻找这个集合中的数字,这显然是从未找到的。所以你的查找函数应该有点不同,例如:

int index3 = clbPerson3.Items.IndexOf(dataSource3.Where(p => p.idPerson == selectedPersons.Data[i].idPerson).Single());