【问题标题】:How to create a list for a ComboBox that allows DBNull?如何为允许 DBNull 的 ComboBox 创建列表?
【发布时间】:2014-11-03 00:28:50
【问题描述】:

如何为允许 DBNull 的 ComboBox 创建一个列表?

我试过 int?int?DBNull 不同,并且组合框不适用于 null 值。

我的 datagridview 组合框,需要 DBNull

我做到了:

var machineComboList = this.eMDataSet1.Machines.Select(row => new
            {
                Key = (int?) row.MachineID,
                Value = row.Description
            }).ToList();

int? nullValue = DBNull.Value;
machineComboList.Add(new { Key = nullValue, Value = "All" });

我想将一个 DBNull 值放入“Key”中。使用 int? 不起作用。

相关:c# combobox binding and first null value

【问题讨论】:

  • “如何在 C# 中声明一个将采用 DBNull 的 int” - 你没有。将其映射到 null (或其他)。在 SO 上也有很多这样的问题。请尝试搜索。
  • 您是否使用 EF 进行数据访问?你不能只用 null 代替 DBNull.Value 吗?
  • @JamesBlond 我试过了,没用。它适用于 DataGridview 中的组合框,当我使用 int 时?它不喜欢它。
  • @MitchWheat 我应该在 SO 上搜索什么 - 我已经找了好几个小时了。
  • @GrantWinney 组合框的两个问题 - 第一个它忽略了 DataGridView 中存在的 DBNull 值,它们显示为空白。第二,如果我尝试让它保存 int,它会给出一个例外? = null 到采用 DBNull 的字段。

标签: c# combobox dbnull


【解决方案1】:

DBNull 仅适用于 ADO.NET,用于区分缺失值和空值。

int? 可以是null——这可能就是您要找的。它永远不能是DBNull,因为它们是不兼容的类型。

在 ADO.NET 调用之外直接使用 DBNull 很少见。从数据库中读取时,通常会这样翻译:

object dbValue = ...;
int? intValue = dbValue != DBNull.Value ? (int)dbValue : (int?)null;

或者,如果您更信任返回的数据类型,您可以将其缩短为:

object dbValue = ...;
int? intValue = dbValue as int?;

【讨论】:

  • 不——我确定我正在寻找 DBNull,它是组合框值/显示对的一部分,并且表中的数据中包含 DBNull 值。
【解决方案2】:

这行得通……我相信有更清洁的方法

        DataTable machineComboList = new DataTable();
        machineComboList.Columns.Add("Value", typeof(string));
        DataColumn machineIdColumn = machineComboList.Columns.Add("Key", typeof(int));
        machineIdColumn.AllowDBNull = true;

        foreach (EMDataSet1.MachinesRow machineRow in this.eMDataSet1.Machines)
        {
            DataRow comboBoxDataRow = machineComboList.NewRow();
            comboBoxDataRow["Value"] = machineRow.Description;
            comboBoxDataRow["Key"] = machineRow.MachineID;
            machineComboList.Rows.Add(comboBoxDataRow);

        }

        DataRow nullComboBoxDataRow = machineComboList.NewRow();
        nullComboBoxDataRow["Value"] = "All";
        nullComboBoxDataRow["Key"] = DBNull.Value;
        machineComboList.Rows.Add(nullComboBoxDataRow);

        dataGridViewComboMachineID.DataSource = machineComboList;
        dataGridViewComboMachineID.DisplayMember = "Value";
        dataGridViewComboMachineID.ValueMember = "Key";

【讨论】:

    【解决方案3】:

    DBNull.Value 不是整数类型,实际上它本身也不是null。相反,它是一个私有类,表示一个空值。

    您可以在reference source 中清楚地看到这一点。它是一个公共密封类,带有一个私有构造函数和一个单例(静态只读)值。


    通常,当您有一个int?,或者实际上是任何空值时,ADO.NET 期望传入一个实际值。这就是为什么您总是看到将null 映射到DBNull.Value 的代码:

    using (var conn = ...)
    using (var cmd = ...)
    {
        cmd.Parameters.AddWithValue("@MachineId", machineId == null ? DBNull.Value : machinId);
    
        // ...
    }
    

    现在,另一方面,您希望如何在用户界面中表示 null 取决于您自己。想一想,用DBNull.Value 表示它并没有什么意义,因为这会严重地将您的应用程序与ADO.NET 联系起来。如果明天您更改为不是 sql 的不同数据存储会发生什么?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-04
      • 1970-01-01
      • 2020-09-04
      • 2017-06-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多