绑定组合框中的空项

本文关键字:组合 绑定 | 更新日期: 2023-09-27 18:01:44

我如何在使用NULL作为插入或更新值的绑定ComboBox中有一个空项?

使用下面的代码,我可以手动添加额外的行。列inspector_id是FK关系的主键。我必须设置inspector_id = -1,因为c#不允许intnull。但是,插入(或更新)失败,因为数据库中没有inspector_id: -1
private void ItemInfo_Load(object sender, EventArgs e)
{
    // TODO: This line of code loads data into the 'someDBDataSet.inspector' table. You can move, or remove it, as needed.
    this.inspectorTableAdapter.ClearBeforeFill = false;
    someDBDataSet.inspectorRow newRow = this.someDBDataSet.inspector.NewinspectorRow();
    newRow.inspector_id = -1; // Since an int in C# cannot be null
    newRow.fullName = "(none)";
    newRow.employeeCode = "";
    this.someDBDataSet.inspector.AddinspectorRow(newRow);
    this.inspectorTableAdapter.Fill(this.someDBDataSet.inspector);
    //this.inspectorTableAdapter.ClearBeforeFill = false;
    // TODO: This line of code loads data into the 'someDBDataSet.item' table. You can move, or remove it, as needed.
    this.itemTableAdapter.Fill(this.someDBDataSet.item);
}

绑定组合框中的空项

找到了!绑定到一个视图,而不是表。

inspector_idComboBox绑定到检查表的新SQL Server视图。

SELECT NULL as inspector_id, '(none)' as fullName, '' as employeeCode
UNION
SELECT inspector_id, fullName, employeeCode
FROM dbo.inspector

优点:

    (none)项在ComboBox
  1. 选择项目时,SelectedItem和文本将持续存在。
  2. SQL视图允许inspector_id
  3. 为NULL值
  4. 在应用程序代码中不需要变通。只需从视图中填充DataSet即可。
  5. 允许更大的灵活性,因为关系没有绑定。

…辉煌!

另一种方法是在选择(none)时清除ComboBox:

private void inspector_idComboBox_SelectedIndexChanged(object sender, EventArgs e)
{
    if (inspector_idComboBox.SelectedValue != null)
        if ((int)inspector_idComboBox.SelectedValue == -1)
            inspector_idComboBox.SelectedItem = null;
}

优点:

  1. 正确的NULL值保存到DataSet并发送到数据库。
  2. 不需要外部清除按钮。

缺点:

  1. 选择(none)也会清除文本。我希望(none)保持选中状态。

在尝试了各种方法之后,我最初决定采用以下方法:

private void ItemInfo_Load(object sender, EventArgs e)
{
    this.inspectorTableAdapter.Fill(this.someDBDataSet.inspector);
    this.itemTableAdapter.Fill(this.someDBDataSet.item);
}
private void noInspector_btn_Click(object sender, EventArgs e)
{
    inspector_idComboBox.SelectedItem = null;
}

我没有在ComboBox中添加一个虚拟项目,而是添加了一个(链接)按钮来清除ComboBox

优点:

  1. ComboBox清除。
  2. tableAdapter设置item.inspector_id = NULL

缺点:

  1. 其他绑定到inspector字段的表单控件保持不变(因为没有"空"inspector行可以使用)。
  2. SelectedItem为空时,inspector_idComboBox不显示任何文本。我更喜欢在框中显示(none)之类的东西。