select checkedlistbox 根据列表检查的项目
select checkedlistbox items checked based on list
我将选中的列表框与我通过执行 select all 从数据库中获取的角色列表绑定。
我有 class 个具有 属性 个角色列表的人。
我通过在数据库上按人员 ID 执行 select 角色来设置 属性。
因此,例如,我的人员有 3 个角色,而我的选中列表框包含所有角色。
现在,我想编辑 Person 并且我希望当编辑表单上的加载事件为 fired.So 时必须检查他的角色:
//checked list box is filled with List and converted to ListBox
((ListBox)rolesClbx).DataSource = BLPersons.SelectRoles();
((ListBox)rolesClbx).DisplayMember = "Name";
//clear only selected (selected and checked are not the same)
rolesClbx.ClearSelected();
//person gets 3 roles
person.Roles = BLPersons.SelectRolesByPersonId(person.PersonID);
for (int i = 0; i < rolesClbx.Items.Count; i++)
{
if (person.Roles.Contains(rolesClbx.Items[i]))
rolesClbx.SetItemCheckState(i, CheckState.Checked);
}
但这不起作用,因为 Contains 在检查时使用引用。 person.Roles 和 rolesClb.Items 中的引用不一样。
首先我建议你提到你的框架(winform
/wpf
/asp.net
/ ...)。
然后上面的每个框架,你应该使用 id
来比较每个角色。我创建了一个基于 win-form
的示例代码,它与您的代码相似,检查它并让我知道您是否仍然有问题。
public class RoleItem
{
public int Id { get; set; }
public string Title { get; set; }
public override string ToString()
{
return Title.ToString();
}
}
private void Page_Load(object sender, EventArgs e)
{
List<RoleItem> _allRoles = new List<RoleItem>()
{
new RoleItem() {Id =1,Title="Role1"},
new RoleItem() {Id =2,Title="Role2"},
new RoleItem() {Id =3,Title="Role3"},
new RoleItem() {Id =4,Title="Role4"},
};
List<RoleItem> _userRoles = new List<RoleItem>()
{
new RoleItem() {Id =1,Title="Role1"},
new RoleItem() {Id =4,Title="Role4"},
};
rolesClbx.DataSource = _allRoles;
for(int i=0;i< _allRoles.Count; i++)
{
if(_userRoles.Any(r => r.Id == _allRoles[i].Id))
{
rolesClbx.SetItemChecked(i, CheckState.Checked);
}
}
}
实际上,我创建了两个列表,第一个是所有角色,第二个是分配给用户的角色。根据每个 roleId
我检查 CheckListBox
项。
我将选中的列表框与我通过执行 select all 从数据库中获取的角色列表绑定。 我有 class 个具有 属性 个角色列表的人。 我通过在数据库上按人员 ID 执行 select 角色来设置 属性。 因此,例如,我的人员有 3 个角色,而我的选中列表框包含所有角色。 现在,我想编辑 Person 并且我希望当编辑表单上的加载事件为 fired.So 时必须检查他的角色:
//checked list box is filled with List and converted to ListBox
((ListBox)rolesClbx).DataSource = BLPersons.SelectRoles();
((ListBox)rolesClbx).DisplayMember = "Name";
//clear only selected (selected and checked are not the same)
rolesClbx.ClearSelected();
//person gets 3 roles
person.Roles = BLPersons.SelectRolesByPersonId(person.PersonID);
for (int i = 0; i < rolesClbx.Items.Count; i++)
{
if (person.Roles.Contains(rolesClbx.Items[i]))
rolesClbx.SetItemCheckState(i, CheckState.Checked);
}
但这不起作用,因为 Contains 在检查时使用引用。 person.Roles 和 rolesClb.Items 中的引用不一样。
首先我建议你提到你的框架(winform
/wpf
/asp.net
/ ...)。
然后上面的每个框架,你应该使用 id
来比较每个角色。我创建了一个基于 win-form
的示例代码,它与您的代码相似,检查它并让我知道您是否仍然有问题。
public class RoleItem
{
public int Id { get; set; }
public string Title { get; set; }
public override string ToString()
{
return Title.ToString();
}
}
private void Page_Load(object sender, EventArgs e)
{
List<RoleItem> _allRoles = new List<RoleItem>()
{
new RoleItem() {Id =1,Title="Role1"},
new RoleItem() {Id =2,Title="Role2"},
new RoleItem() {Id =3,Title="Role3"},
new RoleItem() {Id =4,Title="Role4"},
};
List<RoleItem> _userRoles = new List<RoleItem>()
{
new RoleItem() {Id =1,Title="Role1"},
new RoleItem() {Id =4,Title="Role4"},
};
rolesClbx.DataSource = _allRoles;
for(int i=0;i< _allRoles.Count; i++)
{
if(_userRoles.Any(r => r.Id == _allRoles[i].Id))
{
rolesClbx.SetItemChecked(i, CheckState.Checked);
}
}
}
实际上,我创建了两个列表,第一个是所有角色,第二个是分配给用户的角色。根据每个 roleId
我检查 CheckListBox
项。