插入新行时,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;
}
}
}
由于数据尚未验证,它们不能在Cell
的Value
字段中。
相反,用户输入的输入都在Cell
..的EditedFormattedValue
字段中:
dgv.Rows[e.RowIndex].Cells[e.ColumnIndex].EditedFormattedValue
以及参数CCD_ 6..的CCD_ 5字段:
e.FormattedValue
请注意,在(通常(作为字符串输入到TextBox
下一个控件之后,两者都已经是object
类型了。
还要注意对于现有单元格和已填充单元格,测试其Value
字段实际上是测试旧的未编辑值!因此,对于插入的行,只使用Value
不会有问题,所有行都有!