如何为允许DBNull的组合框创建列表
本文关键字:组合 创建 列表 DBNull | 更新日期: 2023-09-27 18:28:46
如何为允许DBNull的组合框创建列表?
我尝试了int但是int与DBNull不同,组合框不适用于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
仅适用于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的不同数据存储,会发生什么?