插入新行时,DataGridView Cell值无法进行验证

时间:2015-06-04 17:49:23

标签: c# validation datagridview

情况:

我正在使用带有.NET4.0的VS2013中的C#编写Winforms应用程序。

要在DataGridView中执行单元级验证,我处理CellValidating事件。验证时,我使用

访问用户输入值
dgv.Rows[e.RowIndex].Cells[e.ColumnIndex].Value

对于现有行的验证,这可以正常工作。

问题:

当用户在 new 行的单元格中输入内容然后按下Tab键移动到下一个单元格时,CellValidating事件将触发但Value始终包含null。

问题:

如何访问用户在这些情况下键入的内容?我认为在验证之前我应该​​使用EndEdit,但我认为CellValidating本身就是一个“编辑时”事件。

修改

验证发生在验证器类中,验证器类的顶端如下所示:

    public void ValidateCell(string tableName, DataGridView dataGrid, DataGridViewCellValidatingEventArgs e, ColumnCatalogue columnCatalogue)
    {
        if (!(dataGrid.Rows[e.RowIndex].Cells[e.ColumnIndex].Value == null || 
              dataGrid.Rows[e.RowIndex].Cells[e.ColumnIndex].Value == DBNull.Value ||
              string.IsNullOrWhiteSpace(dataGrid.Rows[e.RowIndex].Cells[e.ColumnIndex].Value.ToString()))
            )
        {
            ColumnDetails columnDetails = columnCatalogue.GetColumnDetails(tableName, dataGrid.Columns[e.ColumnIndex].Name);

            switch (columnDetails.DataType)
            {
                case "currency":
                    this.ValidateCurrency(dataGrid, columnDetails, e);
                    break;
                case "date":
                    this.ValidateDate(dataGrid, columnDetails, e);
                    break;
                case "email":
                    this.ValidateEmail(dataGrid, columnDetails, e);
                    break;
                case "int":
                    this.ValidateInt(dataGrid, columnDetails, e);
                    break;
                case "phone":
                    this.ValidatePhone(dataGrid, columnDetails, e);
                    break;
                case "postcode":
                    this.ValidatePostcode(dataGrid, columnDetails, e);
                    break;
                default:
                    break;
            } 
        }
    }

1 个答案:

答案 0 :(得分:3)

由于数据尚未经过验证,因此无法进入Cell Value字段。

相反,用户输入的输入都位于EditedFormattedValue的{​​{1}}字段中..:

Cell

..以及参数dgv.Rows[e.RowIndex].Cells[e.ColumnIndex].EditedFormattedValue 的{​​{1}}字段..:

FormattedValue

请注意,两者都是e类型,在(通常)作为字符串输入e.FormattedValue eding控件之后已经存在。

另请注意对于现有和已填充的单元格,测试其object字段实际上是在测试旧的,未经编辑的值!因此,对于插入的行,您只有TextBox的问题,所有行都有它!