【问题标题】:datatable.GetChanges() shows always first row of DataGridViewdatatable.GetChanges() 始终显示 DataGridView 的第一行
【发布时间】: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


【解决方案1】:
GridViewName.ClearSelection();

【讨论】:

    【解决方案2】:

    尝试在 DataGridViewComboBoxColumn 的 DataSource 中放置一个空值。示例:

    SELECT id, description
    FROM yourTable
    UNION
    SELECT NULL, NULL
    

    【讨论】:

    • 尝试将您的 DtoPerson 的主键设为 object 类型,以便您可以将 DBNull.Value 推送到组合框。从DataTable设置DataGridView的DataSource时,null值有DBNull.Value
    猜你喜欢
    • 2015-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多