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

时间:2014-11-03 00:28:50

标签: c# combobox dbnull

如何为允许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

3 个答案:

答案 0 :(得分:2)

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?;

答案 1 :(得分:1)

这很有用......我相信有一种更清洁的方式

        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";

答案 2 :(得分:0)

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

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


通常,当您拥有int?或任何空值时,ADO.NET需要传入实际值。这就是您始终看到将null映射到{的代码的原因。 {1}}:

DBNull.Value

现在,另一方面,您希望在用户界面中表示using (var conn = ...) using (var cmd = ...) { cmd.Parameters.AddWithValue("@MachineId", machineId == null ? DBNull.Value : machinId); // ... } 的方式取决于您。我认为用null表示它并没有多大意义,因为这会严重地将你的应用程序与ADO.NET联系起来。如果明天你换到一个不是sql的不同数据存储会怎么样?