我有一个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中检查的项目。
答案 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());