如何为允许DBNull的组合框创建列表

本文关键字:组合 创建 列表 DBNull | 更新日期: 2023-09-27 18:28:46

如何为允许DBNull的组合框创建列表?

我尝试了int但是intDBNull不同,组合框不适用于null值。

我的数据网格视图组合框,需要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" });

我想在"Key"中放入一个DBNull值。使用int不起作用。

相关:c#组合框绑定和第一个空值

如何为允许DBNull的组合框创建列表

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

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

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

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

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

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

这很有效。。。我确信有一种更清洁的方式

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

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

您可以在参考资料中清楚地看到这一点。它是一个带有私有构造函数和singleton(静态只读)值的公共密封类


通常,当您有一个int?,或者实际上是任何null值时,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的不同数据存储,会发生什么?