无法编辑DataGridView-cell,验证事件集e.Cancel = true

时间:2015-02-24 12:20:04

标签: c# .net winforms datagridview

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。用户无法编辑此无效值。

在数据绑定期间,我已经取消订阅此事件以禁用它。但现在,如果用户单击进入单元格以编辑无效值,它仍会被触发。调用堆栈窗口显示它是从CellMouseDown - 事件内部触发的。我该如何防止这种情况?我希望只有在用户编辑了一个单元格并离开它时才能验证它。

1 个答案:

答案 0 :(得分:1)

如果您只想验证用户更改值的时间,您可以在应用验证之前检查修改吗?类似的东西:

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

如果用户将值编辑为另一个无效值,则验证将启动,否则将忽略错误数据。