C# 插入新行时,DataGridView单元格值不可用于验证

C# 插入新行时,DataGridView单元格值不可用于验证,c#,validation,datagridview,C#,Validation,Datagridview,情况: 我正在用VS2013中的C#和.NET4.0编写一个Winforms应用程序 为了在DataGridView中执行单元级验证,我处理CellValidating事件。验证时,我使用访问用户输入值 dgv.Rows[e.RowIndex].Cells[e.ColumnIndex].Value 对于现有行的验证,这很好 问题: 当用户在新行的单元格中键入内容,然后按tab键(例如)移动到下一个单元格时,CellValidating事件将触发,但值始终包含null 问题: 在这些情况下,如何

情况:

我正在用VS2013中的C#和.NET4.0编写一个Winforms应用程序

为了在DataGridView中执行单元级验证,我处理CellValidating事件。验证时,我使用访问用户输入值

dgv.Rows[e.RowIndex].Cells[e.ColumnIndex].Value
对于现有行的验证,这很好

问题:

当用户在新行的单元格中键入内容,然后按tab键(例如)移动到下一个单元格时,CellValidating事件将触发,但值始终包含null

问题:

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

编辑

验证在一个validator类中进行,其顶端如下所示:

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

由于数据尚未验证,因此它们不能位于
单元格的
字段中

相反,用户输入的输入既在
单元格
EditedFormattedValue
字段中:

dgv.Rows[e.RowIndex].Cells[e.ColumnIndex].EditedFormattedValue
e.FormattedValue
..和参数
e
FormattedValue
字段:

dgv.Rows[e.RowIndex].Cells[e.ColumnIndex].EditedFormattedValue
e.FormattedValue
请注意,这两种类型都是
对象
,在(通常)作为字符串输入到
文本框
控件中之后已经存在


还要注意对于现有的和填充的单元格,测试其
字段实际上是在测试旧的、未编辑的值!因此,对于插入的行,您不会只有
Value
有问题,所有行都有问题

你能发布完整验证方法的代码吗?@JustinRusso现在补充道,所有这些都非常有意义。现在工作完美无瑕。谢谢你花时间帮忙。