2014-03-13 2 views
2

DateTime 값의 열이있는 datagridview가 있고 그 중 일부는 null입니다. 해당 열을 기준으로 정렬 할 때까지는 문제가 없습니다. 여기null datetimes로 DataGridView 정렬

DataGridView sorting with nulls in DateTime column

발견 나는 SortCompare 코드를 구현했지만 디버거 아직도 내가있는 try-catch있어

Object must be of type DateTime. 

말, 예외를 던지고 내 Application.Run(new MainForm()); 라인 가리키는 내 SortCompare 이벤트 처리기를 사용하면 모든 코드를 성공적으로 실행할 수 있습니다. 이벤트 처리기가 예외가 throw 된 것을 반환하는 경우에만 해당합니다.

이 예외를 어떻게 막을 수 있습니까?

CODE :

은 Visual Studio에서 새로운 C# 윈도우 폼 프로젝트를 열고 Full dockstyle와 폼에 DataGridView를 던져. Form1.cs에서 다음 코드로 public Form1() 방법을 대체 :

public Form1() 
    { 
     InitializeComponent(); 

     //Create datatable and add a datetime column 
     DataTable dTable = new DataTable(); 
     DataColumn dColumn = new DataColumn("DateTimes", typeof(DateTime)); 
     dTable.Columns.Add(dColumn); 

     //Add rows 
     dTable.Rows.Add(DateTime.Now); 
     dTable.Rows.Add(DBNull.Value); 

     //Create a datagridview column and add it to the datagridview 
     DataGridViewTextBoxColumn dgvColumn = new DataGridViewTextBoxColumn(); 
     dgvColumn.Name = dColumn.ColumnName; 
     dgvColumn.ValueType = dColumn.DataType; 
     this.dataGridView1.Columns.Add(dgvColumn); 


     //Add rows to the datagridview based on datatable data. 
     foreach (DataRow dRow in dTable.Rows) 
     { 
      DataGridViewRow dgvRow = new DataGridViewRow(); 
      dgvRow.CreateCells(this.dataGridView1); 
      dgvRow.SetValues(dRow.ItemArray); 
      this.dataGridView1.Rows.Add(dgvRow); 
     } 

     //Hook up sortcompare event handler 
     this.dataGridView1.SortCompare += new DataGridViewSortCompareEventHandler(dataGridView1_SortCompare); 

     //Style datagridview 
     this.dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill; 
    } 

    private void dataGridView1_SortCompare(object sender, DataGridViewSortCompareEventArgs e) 
    { 
     try 
     { 
      if (DBNull.Value.Equals(e.CellValue1) || DBNull.Value.Equals(e.CellValue2)) 
      { 
       if (DBNull.Value.Equals(e.CellValue1) || e.CellValue1.Equals(null)) 
       { 
        e.SortResult = 1; 
       } 
       else if (DBNull.Value.Equals(e.CellValue2) || e.CellValue2.Equals(null)) 
       { 
        e.SortResult = -1; 
       } 
      } 
      else 
      { 
       e.SortResult = (e.CellValue1 as IComparable).CompareTo(e.CellValue2 as IComparable); 
      } 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex.ToString()); 
     } 
    } 

그런 다음 프로그램을 실행하고 예외를 발생하는 열을 정렬하려고합니다.

+0

코드를 표시하십시오. –

+0

대표 코드로 내 질문을 업데이트했습니다. 감사! – user2320861

답변

3

e.Handled = true; true로 설정하면 문제가 해결됩니다.

private void dataGridView1_SortCompare(object sender, DataGridViewSortCompareEventArgs e) 
    { 
     try 
     { 
      if (DBNull.Value.Equals(e.CellValue1) || DBNull.Value.Equals(e.CellValue2)) 
      { 
       if (DBNull.Value.Equals(e.CellValue1) || e.CellValue1.Equals(null)) 
       { 
        e.SortResult = 1; 
       } 
       else if (DBNull.Value.Equals(e.CellValue2) || e.CellValue2.Equals(null)) 
       { 
        e.SortResult = -1; 
       } 
      } 
      else 
      { 
       e.SortResult = (e.CellValue1 as IComparable).CompareTo(e.CellValue2 as IComparable); 
      } 
e.Handled = true 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex.ToString()); 
     } 
    } 
+1

프레이 킹 A! 그 'e.Handled'는 요 전날 셀 페인팅으로 XD를 얻었습니다. 감사! – user2320861