2013-06-27 99 views
1

我在C#/WinForms應用程序中有DataGridView如何格式化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; 
       } 
      } 
     }