Datagridview将Comboboxcolumns绑定到更改列表

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Datagridview将Comboboxcolumns绑定到更改列表相关的知识,希望对你有一定的参考价值。

我试图在Windows窗体项目中使用datagridview作为用户输入。用户应该能够添加新的组合框列并编辑现有列(更改,添加,删除项目)。

现在我有一个“功能”列表

public class Feature
{
    public Guid featureID { get; set; }
    public String name { get; set; } 
    public List<Choice> choices { get; set; } 
}

public class Choice
{
    public String choiceID { get; set; }
    public String name { get; set; }        
}

用户可以创建新功能并编辑现有功能。然后将这些功能添加到列表中。对于每个List Item,datagridview中都应该有一个comboboxcolumn。

当用户添加新功能时,我使用以下代码创建列:

private void addColumnToTable(Feature ft)
    {
        String colName = "column" + ft.name;

        DataGridViewComboBoxColumn col = new DataGridViewComboBoxColumn();
        col.HeaderText = ft.name;
        col.Name = colName;
        col.DataSource = ft.choices;
        col.ValueMember = "choiceID";
        col.DisplayMember = "name";
        dataGridView1.Columns.Add(col);
    }

这非常有效。用户现在可以向数据源列添加输入。假设用户选择一列中的项目,然后决定删除或更新所选择的选项。然后我收到错误,因为所选项目不再存在。我不想删除已更改的列并再次添加,因为我希望在功能编辑之前和之后选择未更改的选项。

如何更新现有列?是否可以将我的featurelist数据绑定到datagridview以实现所需的行为?

谢谢

答案

通常,每当您修改ComboBox列表选项时,您应该:

  • 取消您的Column.DataSource以使UI无效。
  • 将您的Column.DataSource设置为修改后的列表。
  • 重置ValueMemberDisplayMember - 否则它将绑定到整个对象而不是对象的属性。
currentColumn.DataSource = null;
currentColumn.DataSource = modifiedChoices; // List<Choice>
currentColumn.ValueMember = "choiceID";
currentColumn.DisplayMember = "name";

现在你有了选项 - 两者都是为了使无效值无效:

  1. 循环通过该列的单元格。 foreach (DataGridViewRow row in this.dataGridView1.Rows) { if (row.Index != this.dataGridView1.NewRowIndex) { string value = row.Cells[col.Name].Value.ToString(); if (!modifiedChoices.Any(item => item.choiceID == value)) { row.Cells[col.Name].Value = null; } } }
  2. 处理错误对话建议的DataGridView.DataError事件。 this.dataGridView1.DataError += DataGridView1_DataError; private void DataGridView1_DataError(object sender, DataGridViewDataErrorEventArgs e) { if (this.dataGridView1.Columns[e.ColumnIndex] is DataGridViewComboBoxColumn) { this.dataGridView1[e.ColumnIndex, e.RowIndex].Value = null; e.Cancel = true; } }

以上是关于Datagridview将Comboboxcolumns绑定到更改列表的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式将新列添加到 DataGridView(填充有 DataTable 的 DataGridview)

如何将 DataGridView 组合框添加到绑定的 DataGridView 数据源(以编程方式)

winform中datagridview怎么添加行之后将焦点选中在新添加的行?

将 DataGridView 直接绑定到 DataSet 失败

将列表框转换为 DataGridView

将数据从 DataGridView 插入数据库