【发布时间】:2019-11-30 13:48:01
【问题描述】:
我的 C# windows 窗体应用程序中有 2 个Checkedlistbox 控件。首先Checkedlistbox是医生的专业,例如牙医,放射科医生等。如果我选中牙医复选框医生专业Checkedlistbox控件,所有牙医医生将显示在医生姓名Checkedlistbox控件中。
问题是,当我检查牙医Checkedlistbox,然后检查医生Checkedlistbox 的一些牙医时,如果我检查放射科医生Checkedlistbox,那么医生姓名Checkedlistbox 将被重置,并且我所有牙医选中的复选框都将被取消-选择。
我试过的:
医生姓名Checkedlistbox数据源:
DoctorsIDCheckedlistbox.DataSource = _ClinicEntities.Tbl_Doctors
.Where(w => _SelectedSpecialty.Contains(w.SpecialtyID))
.Select(s => new DoctorListCheckbox{ Name = s.Name + " " + s.LastName, DoctorID = s.DoctorID })
.ToList();
DoctorsIDCheckedlistbox.DisplayMember = "Name";
DoctorsIDCheckedlistbox.ValueMember = "DoctorID";
然后我将选中的项目保存在ItemCheck 事件中:
private void DoctorsID_ItemCheck(object sender, ItemCheckEventArgs e)
{
int doctorID = Convert.ToInt32(DoctorsIDCheckedlistbox.SelectedValue);
if (e.NewValue == CheckState.Checked)
{
_SelectedDoctorsChecked.Add(doctorID.ToString());
}
else
{
_SelectedDoctorsChecked.Remove(doctorID.ToString());
}
}
那么对于医生专业ItemCheck事件:
private void SpecialtyTypeID_ItemCheck(object sender, ItemCheckEventArgs e)
{
for (int i = 0; i < DoctorsIDCheckedlistbox.Items.Count; i++)
{
if (_SelectedDoctorsChecked.Contains(DoctorsIDCheckedlistbox.Items[i].ToString()))
{
try
{
DoctorsIDCheckedlistbox.SetItemChecked(i, true);
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
}
}
}
我希望上面的代码通过_SelectedDoctorsChecked 列表查看选定的医生,并在医生的专业复选框状态更改时检查它们。但它不起作用。
示例:
我在医生的专业里勾选了A,第1、2、3项会显示在医生的名字中。我检查1和3。当我在医生专业中检查B时,将显示A中的第1、2和3项以及B中的4、5和6。我希望检查 1 号和 3 号。但它不会。
编辑:
我的Checkedlistbox控件数据源:
DoctorsIDCheckedlistbox.DataSource = _ClinicEntities.Tbl_Doctors
.Where(w => _SelectedSpecialty.Contains(w.SpecialtyID))
.Select(s => new DoctorListCheckbox{ Name = s.Name + " " + s.LastName, DoctorID = s.DoctorID })
.ToList();
DoctorsIDCheckedlistbox.DisplayMember = "Name";
DoctorsIDCheckedlistbox.ValueMember = "DoctorID";
还有DoctorListCheckbox类:
public partial class DoctorListCheckbox
{
public int DoctorID { get; set; }
public string Name { get; set; }
public CheckState CheckState { get; set; }
public override string ToString()
{
return Name;
}
}
我是根据Microsoft Example做的
【问题讨论】:
-
Remove() 是否导致问题?
-
@jdweng,我不这么认为。我已经调试了我的程序。
_SelectedDoctorsChecked中的所有项目都是我选择的。它是正确的。我认为_SelectedDoctorsChecked.Contains(DoctorsIDCheckedlistbox.Items[i].ToString())行有问题。但我找不到问题。 -
为了帮助调试,使 DoctorsIDCheckedlistbox.Items[i].ToString() 成为一个变量,如 string doctorName = DoctorsIDCheckedlistbox.Items[i].ToString();然后检查该值是否正确。
-
它给了我:
"EF.DoctorList"for allDoctorsIDCheckedlistbox.Items[i].ToString()。 -
然后您将每个值都添加到“EF.DoctorList”框中。
标签: c# .net winforms data-binding checkedlistbox