如何将复选框列表与我的班级中的属性绑定?

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());

就是这样!显示患者;如果允许,操作员可以添加/删除/编辑患者。完成编辑后,他通过按OKApply 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 标签

WPF 将枚举列表(或类似列表)绑定到复选框列表

将数据表绑定到复选框列表

有没有办法将复选框列表绑定到 asp.net mvc 中的模型

将 Angular Material Design 复选框绑定到控制器中的数组

使用 formcontrol 将数据绑定到角度材料表中的复选框。数据以真假值列表的形式提供