无法编辑 DataGridView 单元格,验证事件集 e.Cancel = true
Cannot edit DataGridView-cell, Validating-event sets e.Cancel = true
DatagridView
又让我抓狂了。所以我有一个带有 DatagridView
的表格,它一直有效到现在。但是现在数据库中有一个无效值导致 Validating
事件阻塞程序流。
就是这样:
private void GrdChargeAssignment_Validating(Object sender, DataGridViewCellValidatingEventArgs e)
{
e.Cancel = false;
var grid = (DataGridView)sender;
ErpService.ArrivalChargeAssignment ass = grid.Rows[e.RowIndex].DataBoundItem as ErpService.ArrivalChargeAssignment;
string countValue = grid.Rows[e.RowIndex].Cells[AssignedCol.Name].EditedFormattedValue.ToString();
if (string.IsNullOrWhiteSpace(countValue))
{
grid.Rows[e.RowIndex].Cells[AssignedCol.Name].Value = "0";
countValue = "0";
}
int count;
if (!int.TryParse(countValue, out count))
{
grid.Rows[e.RowIndex].ErrorText = "Insert a valid integer for count!";
e.Cancel = true;
}
else if (count > ass.Count_Actual)
{
grid.Rows[e.RowIndex].ErrorText = string.Format("Please insert a count between 0 and arrival-count({0})!", ass.Count_Actual);
e.Cancel = true; // !!!! HERE !!!!
}
if (e.Cancel == false)
grid.Rows[e.RowIndex].ErrorText = "";
}
我用 !!!! HERE !!!!
评论的行导致事件被取消,从而阻止了 gui。用户无法编辑此无效值。
在数据绑定期间,我已经取消订阅此事件以禁用它。但现在如果用户点击单元格编辑无效值,它仍然会被触发。调用堆栈 window 表明它是从 CellMouseDown
事件内部触发的。我怎样才能防止这种情况?我希望它仅在用户编辑单元格并离开时才被验证。
如果您只想在用户更改值时进行验证,是否可以在应用验证之前检查修改?类似于:
else if (count > ass.Count_Actual)
{
if( count == ass.Count )
{
// The data has not changed, do not validate
}
else
{
grid.Rows[e.RowIndex].ErrorText = string.Format("Please insert a count between 0 and arrival-count({0})!", ass.Count_Actual);
e.Cancel = true; // !!!! HERE !!!!
}
}
如果用户将值编辑为另一个无效值,验证将开始,否则,错误数据将被忽略。
DatagridView
又让我抓狂了。所以我有一个带有 DatagridView
的表格,它一直有效到现在。但是现在数据库中有一个无效值导致 Validating
事件阻塞程序流。
就是这样:
private void GrdChargeAssignment_Validating(Object sender, DataGridViewCellValidatingEventArgs e)
{
e.Cancel = false;
var grid = (DataGridView)sender;
ErpService.ArrivalChargeAssignment ass = grid.Rows[e.RowIndex].DataBoundItem as ErpService.ArrivalChargeAssignment;
string countValue = grid.Rows[e.RowIndex].Cells[AssignedCol.Name].EditedFormattedValue.ToString();
if (string.IsNullOrWhiteSpace(countValue))
{
grid.Rows[e.RowIndex].Cells[AssignedCol.Name].Value = "0";
countValue = "0";
}
int count;
if (!int.TryParse(countValue, out count))
{
grid.Rows[e.RowIndex].ErrorText = "Insert a valid integer for count!";
e.Cancel = true;
}
else if (count > ass.Count_Actual)
{
grid.Rows[e.RowIndex].ErrorText = string.Format("Please insert a count between 0 and arrival-count({0})!", ass.Count_Actual);
e.Cancel = true; // !!!! HERE !!!!
}
if (e.Cancel == false)
grid.Rows[e.RowIndex].ErrorText = "";
}
我用 !!!! HERE !!!!
评论的行导致事件被取消,从而阻止了 gui。用户无法编辑此无效值。
在数据绑定期间,我已经取消订阅此事件以禁用它。但现在如果用户点击单元格编辑无效值,它仍然会被触发。调用堆栈 window 表明它是从 CellMouseDown
事件内部触发的。我怎样才能防止这种情况?我希望它仅在用户编辑单元格并离开时才被验证。
如果您只想在用户更改值时进行验证,是否可以在应用验证之前检查修改?类似于:
else if (count > ass.Count_Actual)
{
if( count == ass.Count )
{
// The data has not changed, do not validate
}
else
{
grid.Rows[e.RowIndex].ErrorText = string.Format("Please insert a count between 0 and arrival-count({0})!", ass.Count_Actual);
e.Cancel = true; // !!!! HERE !!!!
}
}
如果用户将值编辑为另一个无效值,验证将开始,否则,错误数据将被忽略。