2013-06-27 3 views
1

У меня есть DataGridView в приложении C#/WinForms.Как форматировать данные в dataGridView

Я хотел бы ввести дату в ячейку.

Если пользователь вводит 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); 
      } 
     } 
    } 
} 

Я не знаю, почему, но если я вход 01012012, то CellValidated событие не срабатывает. У меня есть DataGridView Exception о плохом формате для DateTime.

Как я могу автоотформатировать мою дату, чтобы избежать этой ошибки?

Он сказал: "Строка не признается действительным DateTime"

Спасибо большое, Nixeus

+0

это не ответ на ваш вопрос, но почему бы вам не использовать 'dataGridView_BadgeService [e.RowIndex, e.ColumnIndex ] .Value' вместо 'dataGridView_BadgeService.Rows [e.RowIndex] .Cells [e.ColumnIndex] .Value'? –

+0

Я не знаю почему :) –

+1

Я рекомендую вам потратить некоторое время на создание многократно используемого элемента управления DataGridViewDateTimePicker: http://msdn.microsoft.com/en-us/library/7tas5c80.aspx – tezzo

ответ

0

поправил я себя, я должен использовать CancelEdit() на событие CellValidating:

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