3

我正在制作一个有四列的datagridview。最后一列的类型是以小时和分钟为单位的日期时间 (HH:mm)。

    DataTable.Columns.Add("Time", typeof(DateTime)); //fourth column
    dataGridView2.Columns[3].DefaultCellStyle.Format = "HH:mm";

当我输入有效的 HH:mm(12:37) 格式时,它工作得很好,但如果格式无效 (12:374),它会给我一条错误消息。

    The string wasn't regigniced as a valid DateTime --> System.FormatExeption

它告诉我处理“DataError-exeption / FormatExeption”以更改发生错误时发生的情况,但我该怎么做呢?

我希望它恢复到错误发生之前的值。

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

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

编辑:我直接从 dataGridView 编辑时间值。

4

6 回答 6

4

处理事件DataGridView.DataError,以便您可以正确管理情况并向用户显示正确的消息。

下面的事件处理程序示例取自MSDN

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

并将其添加到您的DataGridView实例中:

dataGridView2.DataError += dataGridView2_DataError;

您可以从该资源中获得有关事件和输入参数的更多信息。

于 2013-05-30T20:08:46.057 回答
0

在 CellValidating 事件中,如果出现错误,您可以设置 e.Cancel = true。见这里:http: //msdn.microsoft.com/en-us/library/system.windows.forms.datagridview.cellvalidating.aspx

于 2013-05-30T19:52:46.593 回答
0

连接格式化事件:

dataGridView.CellFormatting += new DataGridViewCellFormattingEventHandler(dataGridView_CellFormat);

private void dataGridView_CellFormat(Object sender, DataGridViewCellFormattingEventArgs e)
{
    if (dataGridView.Columns[e.ColumnIndex].Name.Equals("Time"))
    {
       DateTime dt;
       if (!DateTime.TryParse(e.Value.ToString(), out dt))
       {
           e.Value = "PreviousValue";
       }
    }
}

我不知道如何获得该行的先前值,但这就是想法。

于 2013-05-30T20:02:26.757 回答
0

简短的回答是我认为不可能。我刚刚遇到了完全相同的问题,只是使用了不同的数据类型。我试图在数据错误事件触发之前编辑该值。据我所知,官方的处理方式是将用户的注意力吸引回单元格并纠正错误。有错误文本和错误图标可以帮助解决这个问题。

单元格的新内容可通过单元格的 formattedvalue 属性获得,但这是只读的,因此无法编辑。

我会参考上一个答案并努力捕获错误类型以向用户显示有意义的错误消息

我最终得到了以下几行代码

Private Sub dgvInvoices_CellValidating(sender As Object, e As System.Windows.Forms.DataGridViewCellValidatingEventArgs) Handles dgvInvoices.CellValidating
    dgvInvoices.Rows(e.RowIndex).Cells(3).ErrorText = ""
    Dim newInteger As Integer

    dgvInvoices.ShowCellErrors = True

    If Not Double.TryParse(e.FormattedValue.ToString(), newInteger) OrElse newInteger < 0 Then

        e.Cancel = True
        dgvInvoices.Rows(e.RowIndex).Cells(3).ErrorText = "the value must be a non-negative integer"
        MsgBox("Ensure the value is a numeric value.", vbExclamation, "Error")

    End If

End Sub

对不起,我可以提供更多帮助

于 2014-08-30T14:44:25.190 回答
0

正如我在这里提到的- 处理 DataGridView.CellValidating 事件:

    private void CellValidating(object sender, DataGridViewCellValidatingEventArgs e)
    {
        try
        {   
            // get current cell
            var cell = ((DataGridView)sender).Rows[e.RowIndex].Cells[e.ColumnIndex];
            // check new value. i need any number >= 5
            var c0 = 0;
            if (e.FormattedValue == null || !Int32.TryParse(e.FormattedValue.ToString(), out c0) || c0 < 5)
            {
                // bad value inserted

                // e.FormattedValue - is new value
                // cell.Value - contains 'old' value

                // choose any:
                cell.Value = cell.Value;    // this way we return 'old' value
                e.Cancel = true;            // this way we make user not leave the cell until he pastes the value we expect
            }
        }
        catch (Exception ex)
        {
        }
    }
于 2015-06-30T20:37:20.187 回答
0

如图所示恢复以前的值不起作用

这是正确的方法

((DataGridView)sender).EditingControl.Text = cell.Value.ToString();
于 2018-12-31T08:11:43.083 回答