检查DataGridViewComboBox是否为空

时间:2015-12-02 20:01:53

标签: c# winforms datagridview datagridcomboboxcolumn

我有一个带有组合框列的datagridview,该列绑定到枚举,如下所示:

     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的DataTable:

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

当用户完成对表的编辑时,我需要对其进行验证。特别是,我需要测试每行中是否已定义Type,并且默认值与Type兼容。

问题是,我找到的用于检查Type是否已设置的每个测试都失败了。当我稍后尝试将值转换为MyType作为测试默认值的一部分时,我收到错误。当我检查调试器中空Type单元格的.Value属性时,它显示的值为" {}"。

目前,我在datagridview本身的Validating事件中有测试代码。我尝试了其他各种版本,但也失败了:

     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。不是我的选择。正是我可以得到的东西。

1 个答案:

答案 0 :(得分:1)

此代码存在一些问题。

首先,D.ValueType = typeof(MyType);不正确,因为从我看到的情况来看,您绑定到int字段。只需删除该行,即可从数据源推断出ValueType

现在,主要问题。绑定到数据表时,未输入的值由DBNull.Value表示。我建议您检查nullDBNull.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 ...
}