我试图在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以实现所需的行为?
谢谢
答案 0 :(得分:0)
通常,每当您修改ComboBox
列表选项时,您应该:
Column.DataSource
以使用户界面无效。Column.DataSource
设置为修改后的列表。ValueMember
和DisplayMember
- 否则它将绑定到整个对象,而不是属性。< / LI>
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;
}
}