我在DataGridView中有一个基于查找表的DataGridViewComboBoxColumn。
ValueMember和DisplayMember字段绑定到DataTable中的字符串列。所有行都有两个字段的值 - 除了特意记录,其中值字段被故意设置为NULL。
但是,当我选择此记录时,在DataGridView中绑定的DataTable中使用空字符串而不是DBNull.Value。这在数据输入时发生,在数据被推送到数据库之前。
我已经检查了DataGridViewComboBoxColumn和DataGridView类 - 似乎没有简单的方法来自定义此行为。有人知道这是否可行?
答案 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。