【发布时间】:2011-06-08 11:18:03
【问题描述】:
我有一个 DataGridView,其绑定源绑定到从 Oracle 数据库加载的数据表。 (顺便说一句。我认为数据库连接不会导致这种情况)
我还有一个绑定到一类人的 DataGridViewComboBoxColumn(只有“具有”ID 和名称),因此我可以显示/允许编辑名称而不是 ID。我现在的问题是,数据绑定完成后,c# 会自动“选择”DGV 的第一个单元格 - 请参见附图。
我还必须使用这段小代码来确保数据完整性:
private void _table_ColumnChanging(object sender, DataColumnChangeEventArgs e)
{
if (e.Column == _table.Columns["NEEDED_ID"])
{
if (e.ProposedValue == null)
{
e.ProposedValue = System.DBNull.Value;
}
}
}
现在使用这个 _table.GetChanges() 总是将 DGV 的第一行作为“修改”返回,但值并没有真正改变 - 它只是 DBNull 而不是 null。我能否以某种方式避免自动选择第一个单元格或如何避免这种行为?
编辑: 同时我发现将第一列更改为不可编辑的内容可以解决此问题。但这只不过是一种解决方法。我真的很感激能为此找到一个可行的解决方案。
编辑 2:我在 ComboBox-DataSource 的“顶部”还有一个空对象
DtoPerson blankPerson = new DtoPerson();
blankPerson.Name = String.Empty;
blankPerson.PersonRollenId = -1;
personList.Add(blankPerson);
【问题讨论】:
-
关于编辑 2:这不完全是一个空对象,您应该将您的 blankPerson 的主键设置为 DBNull.Value。尽管 IMO,在不触及任何前端的情况下解决问题的更简单方法是在查询中使用 UNION SELECT NULL, NULL,ADO.NET 会自动将这些 NULL 转换为相应的 .NET 类型(即 DBNull.Value);我使用了相同的技术,它有效。但首先,将您的 DtoPerson 的主键设为对象类型,以便您的 ORM/DAL 可以将 DBNull 分配给它
标签: c# winforms datagridview datatable bindingsource