2013-06-27 5 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); 
      } 
     } 
    } 
} 

나는 이유는 모르겠지만, 입력 01012012CellValidated 이벤트가 발생하지 않는 경우. DateTime의 형식이 잘못된 DataGridView Exception입니다.

이 오류가 발생하지 않도록하려면 어떻게 날짜를 자동으로 포맷 할 수 있습니까?

그것은 말 :

덕분에 많이 "문자열이 유효한 날짜 시간으로 인식되지 않습니다", 나 자신을 수정 Nixeus

+0

질문에 대한 대답은 아니지만 왜 ' ] .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; 
       } 
      } 
     }