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

本文关键字:用于 验证 单元格 新行时 DataGridView 插入 | 更新日期: 2023-09-27 17:53:17

情况:

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

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

dgv.Rows[e.RowIndex].Cells[e.ColumnIndex].Value

对于现有行的验证,这很好。

问题:

当用户在新行的单元格中键入内容,然后按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;
            } 
        }
    }

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

由于数据尚未验证,它们不能在CellValue字段中。

相反,用户输入的输入都在Cell..的EditedFormattedValue字段中:

dgv.Rows[e.RowIndex].Cells[e.ColumnIndex].EditedFormattedValue

以及参数CCD_ 6..的CCD_ 5字段:

e.FormattedValue

请注意,在(通常(作为字符串输入到TextBox下一个控件之后,两者都已经是object类型了。

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