选中CheckedListBox中的Item,如果它在List中是existend

时间:2017-07-17 07:19:49

标签: c# winforms datasource checkedlistbox

我有一个CheckedListBox。作为DataSource,我使用了我自己的类var dataSource3 = new BindingList<Modells.Person>();的BindingList。

之后我将它们分类为字母。

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

绑定他们。

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

我自己的班级结构如下:

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; }
}

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

现在的任务是设置CheckedListBox中selectedPersons sorteddataSource3 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); } } 的人员。

此时我的解决方案是:

index3

首先,我检查这个人是否显示在CheckedListBox中。 之后我试着得到这个人的索引。这就是我的错误。 -1始终为public static class DAL { public static string connectionString = ConfigurationManager.ConnectionStrings["YourWebConfigConnection"].ConnectionString; // function that creates a list of an object from the given data table public static List<T> CreateListFromTable<T>(DataTable tbl) where T : new() { // define return list List<T> lst = new List<T>(); // go through each row foreach (DataRow r in tbl.Rows) { // add to the list lst.Add(CreateItemFromRow<T>(r)); } // return the list return lst; } // function that creates an object from the given data row public static T CreateItemFromRow<T>(DataRow row) where T : new() { // create a new object T item = new T(); // set the item SetItemFromRow(item, row); // return return item; } public static void SetItemFromRow<T>(T item, DataRow row) where T : new() { // go through each column foreach (DataColumn c in row.Table.Columns) { // find the property for the column PropertyInfo p = item.GetType().GetProperty(c.ColumnName); // if exists, set the value if (p != null && row[c] != DBNull.Value) { p.SetValue(item, row[c], null); } } } //call stored procedure to get data. public static DataSet GetRecordWithExtendedTimeOut(string SPName, params SqlParameter[] SqlPrms) { DataSet ds = new DataSet(); SqlCommand cmd = new SqlCommand(); SqlDataAdapter da = new SqlDataAdapter(); SqlConnection con = new SqlConnection(connectionString); try { cmd = new SqlCommand(SPName, con); cmd.Parameters.AddRange(SqlPrms); cmd.CommandTimeout = 240; cmd.CommandType = CommandType.StoredProcedure; da.SelectCommand = cmd; da.Fill(ds); } catch (Exception ex) { return ex; } return ds; } }

我正在寻找一个解决方案来设置在CheckedListBox中检查的项目。

2 个答案:

答案 0 :(得分:2)

问题是,selectedPersons中的对象可能与sorteddataSource3中的对象具有相同的值,但它们自身的对象不同。你需要实现某种比较。一个非常简单的方法是从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);
}

答案 1 :(得分:0)

您的clbPerson3.Items是强类型的,每个项目都是Person类型,并且您正在寻找此集合中的数字,这显然是找不到的。所以你的查找功能应该有点不同,例如:

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