使用DataGridView中的DataGridViewComboBoxColumn将绑定字段的值设置为NULL

时间:2008-12-03 01:54:43

标签: .net winforms data-binding

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

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

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

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

3 个答案:

答案 0 :(得分:2)

好吧,我确实提出了 解决方案。因为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控件级实现的解决方案。

答案 1 :(得分:0)

我使用类型化数据集来提供下拉列表的值。填充数据库中的值后,我添加另一个行以提供null支持。填充数据表的方法的最后几行看起来像这样......

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

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

HTH - 理查德

答案 2 :(得分:0)

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

我的解决方案是在表单加载中手动添加包含“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语句的存储过程。在存储过程中,我吞下“无”条目 - 这意味着如果接收“无”作为过程的参数,我将其替换为NULL。这允许用户选择“无”,但一旦保存,该条目将恢复为NULL。