Datagridview将Comboboxcolumns绑定到更改列表

时间:2017-12-17 12:05:04

标签: c# winforms data-binding datagridview

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

现在我有一个"功能列表"

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以实现所需的行为?

谢谢

1 个答案:

答案 0 :(得分:0)

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

  • 取消您的Column.DataSource以使用户界面无效。
  • Column.DataSource设置为修改后的列表。
  • 重置ValueMemberDisplayMember - 否则它将绑定到整个对象,而不是属性。< / LI>
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;
        }
    }