如何为允许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?不起作用。
答案 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的不同数据存储会怎么样?