情况:
我正在使用带有.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;
}
}
}
答案 0 :(得分:3)
由于数据尚未经过验证,因此无法进入Cell
Value
字段。
相反,用户输入的输入都位于EditedFormattedValue
的{{1}}字段中..:
Cell
..以及参数dgv.Rows[e.RowIndex].Cells[e.ColumnIndex].EditedFormattedValue
的{{1}}字段..:
FormattedValue
请注意,两者都是e
类型,在(通常)作为字符串输入e.FormattedValue
eding控件之后已经存在。
另请注意对于现有和已填充的单元格,测试其object
字段实际上是在测试旧的,未经编辑的值!因此,对于插入的行,您只有TextBox
的问题,所有行都有它!