检查 DataGridViewComboBox 是否为空
Check if DataGridViewComboBox is empty
我有一个带有组合框列的数据网格视图,该列绑定到一个枚举,如下所示:
var D = (DataGridViewComboBoxColumn)dgvInputs.Columns[2];
D.ValueType = typeof(MyType);
D.ValueMember = "Value";
D.DisplayMember = "Display";
D.DataSource = new MyType[] {
MyType.Rev,
MyType.Model,
MyType.User,
MyType.Status
}.Select(x => new { Display = x.ToString(), Value = (int)x }).ToList();
然后将 datagridview 绑定到名为 ParameterTable 的数据表:
BindingSource ParamSource = new BindingSource();
ParamSource.DataSource = DataEntry.ParameterTable;
dgvInputs.AutoGenerateColumns = false;
dgvInputs.DataSource = ParamSource;
dgvInputs.Columns[0].DataPropertyName = "Name";
dgvInputs.Columns[1].DataPropertyName = "Prompt";
dgvInputs.Columns[2].DataPropertyName = "Type";
dgvInputs.Columns[3].DataPropertyName = "Width";
dgvInputs.Columns[4].DataPropertyName = "Default Value";
当用户完成编辑 table 后,我需要对其进行验证。特别是,我需要测试是否已在每一行中定义了类型,并且默认值是否与类型兼容。
问题是,我找到的每项检查类型是否已设置的测试都失败了。当我稍后尝试将该值转换为 MyType 作为测试默认值的一部分时,出现错误。当我检查调试器中空类型单元格上的 .Value 属性 时,它显示值“{}”。
目前,我有这段测试代码,在 datagridview 本身的验证事件中。我尝试了其他各种版本,但都失败了:
foreach (DataGridViewRow Row in dgvInputs.Rows) {
if (!Row.IsNewRow) {
// test other columns ...
DataGridViewComboBoxCell Cell = (DataGridViewComboBoxCell)(Row.Cells[2]);
if (Cell == null || Cell.Value as string == string.Empty) {
// Error ...
}
MyType PType = (MyType)(Cell.Value);
如何测试是否未设置 DataGridViewComboBox 单元格,这个值“{}”是什么?
仅供参考 - 我使用的是 VS 2008 和 .Net 3.5 SP1。不是我的选择。正是我能得到的。
这段代码有几个问题。
首先,D.ValueType = typeof(MyType);
是不正确的,因为据我所知,您正在绑定到 int
字段。只需删除该行,ValueType
将从数据源中推断出来。
现在,主要问题。绑定到数据 table 时,未输入的值由 DBNull.Value
表示。我建议您同时检查 null
和 DBNull.Value
。输入时,您的案例中的值类型将为 int
,但您可以安全地将其拆箱为 MyType
。
代码应该是这样的
//...
var value = Row.Cells[2].Value;
if (value == null || value == DBNull.Value)
{
// Error ...
}
else
{
var type = (MyType)value;
// Check if type contains a valid value ...
}
我有一个带有组合框列的数据网格视图,该列绑定到一个枚举,如下所示:
var D = (DataGridViewComboBoxColumn)dgvInputs.Columns[2];
D.ValueType = typeof(MyType);
D.ValueMember = "Value";
D.DisplayMember = "Display";
D.DataSource = new MyType[] {
MyType.Rev,
MyType.Model,
MyType.User,
MyType.Status
}.Select(x => new { Display = x.ToString(), Value = (int)x }).ToList();
然后将 datagridview 绑定到名为 ParameterTable 的数据表:
BindingSource ParamSource = new BindingSource();
ParamSource.DataSource = DataEntry.ParameterTable;
dgvInputs.AutoGenerateColumns = false;
dgvInputs.DataSource = ParamSource;
dgvInputs.Columns[0].DataPropertyName = "Name";
dgvInputs.Columns[1].DataPropertyName = "Prompt";
dgvInputs.Columns[2].DataPropertyName = "Type";
dgvInputs.Columns[3].DataPropertyName = "Width";
dgvInputs.Columns[4].DataPropertyName = "Default Value";
当用户完成编辑 table 后,我需要对其进行验证。特别是,我需要测试是否已在每一行中定义了类型,并且默认值是否与类型兼容。
问题是,我找到的每项检查类型是否已设置的测试都失败了。当我稍后尝试将该值转换为 MyType 作为测试默认值的一部分时,出现错误。当我检查调试器中空类型单元格上的 .Value 属性 时,它显示值“{}”。
目前,我有这段测试代码,在 datagridview 本身的验证事件中。我尝试了其他各种版本,但都失败了:
foreach (DataGridViewRow Row in dgvInputs.Rows) {
if (!Row.IsNewRow) {
// test other columns ...
DataGridViewComboBoxCell Cell = (DataGridViewComboBoxCell)(Row.Cells[2]);
if (Cell == null || Cell.Value as string == string.Empty) {
// Error ...
}
MyType PType = (MyType)(Cell.Value);
如何测试是否未设置 DataGridViewComboBox 单元格,这个值“{}”是什么?
仅供参考 - 我使用的是 VS 2008 和 .Net 3.5 SP1。不是我的选择。正是我能得到的。
这段代码有几个问题。
首先,D.ValueType = typeof(MyType);
是不正确的,因为据我所知,您正在绑定到 int
字段。只需删除该行,ValueType
将从数据源中推断出来。
现在,主要问题。绑定到数据 table 时,未输入的值由 DBNull.Value
表示。我建议您同时检查 null
和 DBNull.Value
。输入时,您的案例中的值类型将为 int
,但您可以安全地将其拆箱为 MyType
。
代码应该是这样的
//...
var value = Row.Cells[2].Value;
if (value == null || value == DBNull.Value)
{
// Error ...
}
else
{
var type = (MyType)value;
// Check if type contains a valid value ...
}