【问题标题】:Set value of bound field to NULL using DataGridViewComboBoxColumn in DataGridView使用 DataGridView 中的 DataGridViewComboBoxColumn 将绑定字段的值设置为 NULL
【发布时间】:2010-09-25 01:29:46
【问题描述】:

我在基于查找表的 DataGridView 中有一个 DataGridViewComboBoxColumn。

ValueMember 和 DisplayMember 字段绑定到 DataTable 中的字符串列。所有行都有两个字段的值 - 除了值字段被故意设置为 NULL 的特殊记录。

但是,当我选择此记录时,将使用空字符串而不是绑定到 DataGridView 的 DataTable 中的 DBNull.Value。这发生在数据输入时,在数据被推送到数据库之前。

我检查了 DataGridViewComboBoxColumn 和 DataGridView 类 - 似乎没有简单的方法来自定义此行为。有人知道这是否可能吗?

【问题讨论】:

    标签: .net winforms data-binding


    【解决方案1】:

    嗯,我确实想出了一个解决方案。因为 DataGridView 是数据绑定的,所以我为 DataTable 实现了 ColumnChanging 事件。示例代码:

    void Schedule_ColumnChanging(object sender, DataColumnChangeEventArgs e)
    {
        if 
        ( 
            e.Column.ColumnName == "Site" &&
            e.ProposedValue is string && 
            e.ProposedValue as string == ""
        )
        e.ProposedValue = DBNull.Value;
    }
    

    这可以解决问题。虽然我想知道是否有可以在DataGridView控件级别实现的解决方案。

    【讨论】:

      【解决方案2】:

      我使用类型化的数据集来提供下拉列表的值。从数据库中填充值后,我添加 another 行以提供 null 支持。填充数据表的方法的最后几行如下所示...

      // Fill dt from datatable...
      var nullRow = rv.NewRunDropDownEntryRow();
      nullRow.SetIDNull();
      nullRow.Title = "None";
      rv.AddRunDropDownEntryRow(nullRow);
      rv.AcceptChanges();
      

      在那之后它就可以工作了! null 值在下拉列表中显示为“None”,您可以轻松地在绑定行中更新为 null 或从 null 更新。

      HTH - 理查德

      【讨论】:

        【解决方案3】:

        我在数据库中的查找表没有“无”条目。因此,不允许输入“无”。外键约束阻止在包含与查找表对应的 id 的子表中输入“None”。

        我的解决方案是在表单加载中手动添加一个包含“无”的行(在 TableAdapter 已经用数据库中的真实行填充表之后)。

        //' Add a 'None' row to allow the user to un-select a lookup item
        //' The insert and update stored procedure translates a 'None' entry to NULL.
        Dim newRow As MyLookupDataset.MyTableRow = Me.MyLookupDataset.MyTable.NewMyTableRow
        newRow.MyID = "None" 
        newRow.MyDesc = "None"
        Me.MyLookupDataset.MyTable.Rows.InsertAt(newRow, 0)
        

        我为 TableAdapter 的 Insert 和 Update 语句使用了存储过程。在存储过程中,我吞下了“None”条目——这意味着如果接收到“None”作为过程的参数,我将其替换为 NULL。这允许用户选择“无”,但一旦保存条目将恢复为 NULL。

        【讨论】:

          猜你喜欢
          • 2021-09-22
          • 2014-04-06
          • 2019-01-27
          • 2012-12-05
          • 2016-02-07
          • 1970-01-01
          • 2012-05-09
          • 1970-01-01
          相关资源
          最近更新 更多