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
设置为修改后的列表。 - 重置
ValueMember
和DisplayMember
- 否则它将绑定到整个对象而不是对象的属性。
currentColumn.DataSource = null;
currentColumn.DataSource = modifiedChoices; // List<Choice>
currentColumn.ValueMember = "choiceID";
currentColumn.DisplayMember = "name";
现在你有了选项 - 两者都是为了使无效值无效:
- 循环通过该列的单元格。
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; } } }
- 处理错误对话建议的
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怎么添加行之后将焦点选中在新添加的行?