1

我有DataGridView一个C#/WinForms应用程序。

我想在单元格中输入日期。

如果用户输入01/01/2012,没关系,但如果01012012是输入,我有一个例外。

我能够使用CellValidating事件验证输入。

不过,如果用户输入日期,我想自动格式化01012012,显然,我需要在 CellValidated 事件中执行此操作。

这是我的代码:

private void dataGridView_BadgeService_CellValidating(object sender, DataGridViewCellValidatingEventArgs e)
{
    if (dataGridView_BadgeService.Columns[e.ColumnIndex].Name == "DateDebut" || dataGridView_BadgeService.Columns[e.ColumnIndex].Name == "DateFin")
    {
        String date = Convert.ToString(e.FormattedValue).Trim();
        if (date.Length > 0)
        {
            try
            {
                DateTime _date;
                if (DateTime.TryParse(date, out _date) == false)
                {
                    if (DateTime.TryParseExact(date, "ddMMyyyy", CultureInfo.InvariantCulture, DateTimeStyles.None, out _date) == false)
                    {
                        MessageBox.Show("Merci de saisir une date, ou laissez cette zone vierge", "Action-Informatique", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                        e.Cancel = true;
                    }
                }
            }
            catch
            {
                MessageBox.Show("Merci de saisir une date, ou laissez cette zone vierge", "Action-Informatique", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                e.Cancel = true;
            }
        }
    }
}

private void dataGridView_BadgeService_CellValidated(object sender, DataGridViewCellEventArgs e)
{
    if (dataGridView_BadgeService.Columns[e.ColumnIndex].Name == "DateDebut" || dataGridView_BadgeService.Columns[e.ColumnIndex].Name == "DateFin")
    {
        String date = Convert.ToString(dataGridView_BadgeService.Rows[e.RowIndex].Cells[e.ColumnIndex].Value).Trim();
        if (date.Length > 0)
        {
            try
            {
                DateTime _date;
                if (DateTime.TryParse(date, out _date) == true)
                {
                    dataGridView_BadgeService.Rows[e.RowIndex].Cells[e.ColumnIndex].Value = _date.ToShortDateString();
                }
                else
                {
                    if (DateTime.TryParseExact(date, "ddMMyyyy", CultureInfo.InvariantCulture, DateTimeStyles.None, out _date) == true)
                    {
                        dataGridView_BadgeService.Rows[e.RowIndex].Cells[e.ColumnIndex].Value = _date.ToShortDateString();
                    }
                }
            }
            catch
            {
                MessageBox.Show("Merci de saisir une date, ou laissez cette zone vierge", "Action-Informatique", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
            }
        }
    }
}

我不知道为什么,但如果我输入01012012CellValidated事件不会触发。我有一个DataGridView Exception关于DateTime.

如何自动格式化我的日期以避免此错误?

它说:“字符串未被识别为有效的日期时间”

非常感谢,尼克修斯

4

1 回答 1

0

我纠正了自己,我需要在 CellValidating 事件上使用 CancelEdit() :

       private void dataGridView_BadgeService_CellValidating(object sender, DataGridViewCellValidatingEventArgs e)
    {
        if (dataGridView_BadgeService.Columns[e.ColumnIndex].Name == "DateDebut" || dataGridView_BadgeService.Columns[e.ColumnIndex].Name == "DateFin")
        {
            string date = Convert.ToString(e.FormattedValue).Trim();

            if (date.Length > 0)
            {
                try
                {
                    DateTime _date;
                    if (DateTime.TryParse(date, out _date) == false)
                    {

                        if (DateTime.TryParseExact(date, "ddMMyyyy", CultureInfo.InvariantCulture, DateTimeStyles.None, out _date) == false)
                        {
                            MessageBox.Show("Merci de saisir une date, ou laissez cette zone vierge", "Error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                            e.Cancel = true;
                        }
                        else
                        {
                            dataGridView_BadgeService.CancelEdit();
                            e.Cancel = false;
                        }
                    }
                    else
                    {
                        dataGridView_BadgeService.CancelEdit();
                        e.Cancel = false;
                    }


                }
                catch
                {
                    MessageBox.Show("Merci de saisir une date, ou laissez cette zone vierge", "Error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                    e.Cancel = true;
                }
            }
        }
于 2013-06-28T07:42:46.047 回答