无法以编程方式编辑dataGridView单元格值

时间:2013-05-31 15:06:53

标签: c# winforms datetime datagridview edit

我正在制作一个错误的汉德尔,当我输入无效的时间或日期格式(如12:456和55-32-1986)时,它会激活。然后程序应该将单元格值更改回prev值。

我使用的是.NET 4.5,这是一个winforms应用程序

代码:

dataGridView2.DataError += dataGridView2_DataError;

private void dataGridView2_DataError(object sender, DataGridViewDataErrorEventArgs anError)
{
    // MessageBox.Show("Error happened " + anError.Context.ToString());

    if (anError.Context == DataGridViewDataErrorContexts.Commit)
    {
        MessageBox.Show("Commit error");
    }

    if (anError.Context == DataGridViewDataErrorContexts.CurrentCellChange)
    {
        MessageBox.Show("Cell change");
    }

    if (anError.Context == DataGridViewDataErrorContexts.Parsing)
    {
        MessageBox.Show("parsing error");
    }

    if (anError.Context == DataGridViewDataErrorContexts.LeaveControl)
    {
        MessageBox.Show("leave control error");
    }

    if ((anError.Exception) is ConstraintException)
    {
        DataGridView view = (DataGridView)sender;
        view.Rows[anError.RowIndex].ErrorText = "an error";
        view.Rows[anError.RowIndex].Cells[anError.ColumnIndex].ErrorText = "an error";

        anError.ThrowException = false;
    }

    if ((anError.Exception) is FormatException)
    {
        if (dataGridView2.CurrentCell == dataGridView2.CurrentRow.Cells[3])
        {
            MessageBox.Show("Please enter a valid time value" + prevTime);
            dataGridView2.CurrentCell.Value = prevTime;
            dataGridView2.EndEdit();
        }
        if (dataGridView2.CurrentCell == dataGridView2.CurrentRow.Cells[2])
        {
            MessageBox.Show("Please enter a valid date");
            dataGridView2.CurrentCell.Value = prevDate;
            dataGridView2.EndEdit();
        }
    }

    //cell types
    d.Tables.Add(booking);
        booking.Columns.Add("nr.", typeof(int));
        booking.Columns.Add("Name", typeof(string));
        booking.Columns.Add("Date", typeof(DateTime));
        booking.Columns.Add("Time", typeof(DateTime));

    //Datasource
    dataGridView2.DataSource = booking;
}

prevDate-和TimeValue在datagrid_onBeginEdit中声明,以便我有值。

我有以前的价值观。代码从头到尾运行。但是从第2行开始,之后,它不会以编程方式更改单元格的值。我只能手工制作, 当代码无法更改值时,错误消息框将继续显示。 datagridview不是只读的。

细胞:nr。 /姓名/日期/时间

任何帮助将不胜感激,提前谢谢。

编辑:我添加了活动handeler的完整代码

PS。如果我在某处不清楚,或者您需要更多信息,那么只需告诉您需要什么。

1 个答案:

答案 0 :(得分:3)

你不需要自己保存prevDate和prevTime,我已经尝试恢复它们,但似乎我们无法改变它们(我仍然很高兴找到如何在这种情况下改变它们)。但是我在这里有最好的解决方案,我们只需要使用DataGridView的方法CancelEdit(),它应该是你想要的,虽然它没有显示如何在你描述的上下文中更改单元格值题。这是代码:

if ((anError.Exception) is FormatException)
{
    if (dataGridView2.CurrentCell == dataGridView2.CurrentRow.Cells[3])
    {
        MessageBox.Show("Please enter a valid time value" + prevTime);
        dataGridView2.CancelEdit();//Only this works
    }
    if (dataGridView2.CurrentCell == dataGridView2.CurrentRow.Cells[2])
    {
        MessageBox.Show("Please enter a valid date");
        dataGridView2.CancelEdit();//Only this works
    }
}

我希望它再次有用,我仍然对如何在这种情况下改变单元格值感到兴奋。如果我发现该怎么做,我会把它作为另一个答案发给你。谢谢!