如何将复选框列表与我的班级中的属性绑定?
Posted
技术标签:
【中文标题】如何将复选框列表与我的班级中的属性绑定?【英文标题】:How to bind a checkboxlist with properties in my class? 【发布时间】:2021-10-20 07:47:11 【问题描述】:我正在创建一个有两种形式的应用程序,一种是用于了解我在选择哪个文件,第二种是在之前做一个过滤器,这意味着您可以选择要在此文件中看到的属性。我有一个带有我的属性的复选框列表和类。
我的第一个表单中还有一个按钮:
foreach (var item in ds)
DataGridViewRow row = new DataGridViewRow();
fileListDataGridView.Rows.Add(
item.Path,
item.PatientName,
item.PatientID);
我不确定这是如何从 DataGridWiev 的列表中添加数据的正确方法,但现在我有这个解决方案。因为它只是在列表末尾添加一个新项目。
问题是我有第二种形式的checkedListBox,我需要以某种方式将它与我的属性绑定。
属性:
public string Path get; set;
public string PatientName get; set;
public string PatientID get; set;
当您单击带有患者姓名的复选框时,这意味着您将在您的第一个表单中获得仅具有此属性的信息。我知道当我们制作一个checkedListBox时,我们也有一个索引,但是我怎样才能得到这个索引并将它与我的prop绑定呢?
【问题讨论】:
【参考方案1】:不熟悉 DataGridView 编程的人往往会摆弄 DataGridView 的行和单元格。这很麻烦,难以理解,难以重用并且非常难以进行单元测试。
使用数据绑定更容易。
显然您想在 DataGridView 中显示 Patient
的多个属性。
class Patient
public int Id get; set;
public string Name get; set;
public string Path get; set;
... // other properties?
使用 Visual Studio,您已经添加了 DataGridView 和要显示的列。在表单的构造函数中:
public MyForm()
InitializeComponent();
// assign Patient properties to the columns:
this.columnId.DataPropertyName = nameof(Patient.Id);
this.columnName.DataPropertyName = nameof(Patient.Name);
this.columnPath.DataPropertyName = nameof(Patient.Path);
... // etc.
在表单中的某处,您有一个方法来获取必须显示的患者:
IEnumerable<Patient> FetchPatientsToDisplay()
... // TODO: implement; out-of-scope of this question
要显示患者,我们使用 BindingList:
BindingList<Patient> DisplayedPatients
get => (BindingList<Patient>)this.dataGridView1.DataSource;
set => this.dataGridView1.DataSource = value;
现在在加载表单时填充 DataGridView:
void OnFormLoading(object sender, ...)
this.ShowPatients();
void ShowPatients()
this.DisplayedPatients = new BindingList<Patient>(this.FetchPatientsToDisplay().ToList());
就是这样!显示患者;如果允许,操作员可以添加/删除/编辑患者。完成编辑后,他通过按OK
或Apply Now
按钮通知程序:
void ButtonOk_Clicked(object sender, ...)
// Fetch the edited Patients:
ICollection<Patient> editedPatients = this.DisplayedPatients;
// find out which patients are changed and process them
this.ProcessPatients(editedPatients);
因此您不需要自己添加/删除行。通常操作员会这样做。如果默认患者不足以让您显示,请使用事件BindingList.AddningNew:
void OnAddingNewPatient(object sender, AddingNewEventArgs e)
// create a new Patient and give it the initial values that you want
e.NewObject = new Patient()
Id = 0, // zero: this Patient has no Id yet, because it is not added to the database yet
Name = String.Empty,
Path = String.Empty,
也许以下属性可能有用:
Patient CurrentPatient => (Patient) this.dataGridView1.CurrentRow?.DataBoundItem;
如果你允许多选:
IEnumerable<Patient> SelectedPatients = this.dataGridView1.SelectedRows
.Cast(row => row.DataGridViewRow)
.Select(row => row.DataBoundItem)
.Cast<Patient>();
换句话说:将 datagridView 中的每个选定行解释为 DataGridViewRow。从每个 DataGridViewRow 获取数据绑定到它的项目。我们知道这是一个 Patient,所以我们可以将它转换为 Patient。
【讨论】:
这个答案很有用,谢谢!以上是关于如何将复选框列表与我的班级中的属性绑定?的主要内容,如果未能解决你的问题,请参考以下文章
为啥表单标签会与我的 ngModel 和属性绑定混淆? ngModel 在 ngFor 里面 Form 标签
有没有办法将复选框列表绑定到 asp.net mvc 中的模型