【问题标题】:NULL Empty Item in Bound ComboBox绑定组合框中的 NULL 空项
【发布时间】:2014-05-05 20:51:27
【问题描述】:

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

使用下面的代码,我可以手动添加额外的行。 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);
}

【问题讨论】:

    标签: c# .net winforms data-binding


    【解决方案1】:

    Eureka!绑定到视图,而不是表。

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

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

    优点:

    1. (none) 项目在ComboBox
    2. 选择项目时,SelectedItem 和文本仍然存在。
    3. SQL 视图允许inspector_id 使用 NULL 值
    4. 应用程序代码中不需要变通方法。只需从视图中填写 DataSet
    5. 允许更大的灵活性,因为关系不受约束。

    ...太棒了!

    【讨论】:

      【解决方案2】:

      另一种方法是在选择(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) 保持选中状态。

      【讨论】:

        【解决方案3】:

        在尝试了各种方法后,我最初决定如下:

        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) 之类的内容。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多