2012-10-19 3 views
0

데이터베이스의 저장 프로 시저에서 반환 된 데이터를 보유하고있는 DataGridView가 있습니다. 열은 반환 값마다 다르므로 강력한 형식의 이름은 사용하지 마십시오. 현재 숫자 열이 문자열로 정렬되어 있으므로 이러한 순서를 정하기 위해 고심하고 있습니다 (예 : 1 -> 10 -> 11 -> 15 -> 2 -> 25 -> 3이며 가치가 아닌. 열의 ValueType이 올바르게 설정되었는지 확인했습니다. 이 시도 가지고 _rowArray은 데이터 행의 배열이며, DataGridView에의 데이터 소스이고, columnIndex에 사용자에 의해 주문하고자 _rowArray에서 열 정수 변수를 지정하는 것OrderBy 명명 된 인덱스

var sortedRows = from row in _rowArray 
          orderby columnIndex 
          select row; 
       _rowArray = sortedRows.ToArray(); 

. 디버깅하는 동안 sortedRows는 LINQ 문 바로 뒤에 오는 동일한 순서로 _rowArray와 동일한 순서를 유지한다는 것을 알 수 있습니다.

_rowArray = _rowArray.OrderBy(r => r[columnIndex]).ToArray(); 

을하고 DataView를 (보기)를 만드는 시도하고 이런 짓을했는지 : 나는 또한 시도

view.Sort = m_data.Tables[0].Columns[columnIndex].ColumnName + " ASC";   

을 ...하지만 그 일을하지 않았다. 누구나 통찰력을 제공합니까?

답변

1

주문하기 전에 문자열을 int로 구문 분석 해 보았습니까?

_rowArray = _rowArray.OrderBy(r => int.Parse(r[columnIndex])).ToArray(); 
+0

자체적으로 문제를 제시

나는 다른 스레드에서 구문 분석 방법을 사용했다. 첫째, int가 아닌 모든 값 유형이 될 수 있습니다. 둘째, null 일 수 있습니다. 또한 Double, int 등으로 구문 분석하기 전에 r [columnIndex]을 문자열로 변환해야합니다. – MrShoes

+0

값 유형을 모르는 경우에는 단순히 정수로 정렬 될 것으로 기대할 수 없습니다.). 다른 대안은 Comparer을 사용하여 이전 방식으로 정렬하는 것입니다. –

+0

var dataType = dataGridView1.Columns [columnIndex] .ValueType;을 사용하여 데이터 유형을 가져올 수 있습니다. – MrShoes

0

덕분에 lcfseth의 도움, 그리고 꽤 추한 있지만 또한 스레드 here, 나는이 문제를 해결했습니다. 다음 내 자신의 방법이되고있다

public static T Parse<T>(object value) 
{ 
    try { return (T)System.ComponentModel.TypeDescriptor.GetConverter(typeof(T)).ConvertFrom(value.ToString()); } 
    catch { return default(T); } 
} 

:

private void SortRows(int columnIndex, ListSortDirection direction) 
     { 
      if ((_rowArray == null) || (!_rowArray.Any())) 
       return; 

      dataGridView1.EndEdit(); 

      RemoveRowDefinitions(); 

      if (direction == ListSortDirection.Ascending) 
      { 
       var dataType = dataGridView1.Columns[columnIndex].ValueType; 
       try 
       { 
        switch (dataType.Name.ToLower()) 
        { 
         case "double": 
          _rowArray = _rowArray.OrderBy(r => Parse<double?>(r[columnIndex].ToString())).ToArray(); 
          break; 
         case "int32": 
          _rowArray = _rowArray.OrderBy(r => Parse<int?>(r[columnIndex].ToString())).ToArray(); 
          break; 
         case "datetime": 
          _rowArray = _rowArray.OrderBy(r => Parse<DateTime?>(r[columnIndex].ToString())).ToArray(); 
          break; 
         default: 
          _rowArray = _rowArray.OrderBy(r => r[columnIndex].ToString()).ToArray(); 
          break; 
        } 
       } 
       catch(Exception ex) 
       { 
        throw new Exception("Cannot sort on the data type '" + dataType.Name + "'", ex); 
       }    
      } 

      if (direction == ListSortDirection.Descending) 
      { 
       var dataType = dataGridView1.Columns[columnIndex].ValueType; 
       try 
       { 
        switch (dataType.Name.ToLower()) 
        { 
         case "double": 
          _rowArray = _rowArray.OrderByDescending(r => Parse<double?>(r[columnIndex].ToString())).ToArray(); 
          break; 
         case "int32": 
          _rowArray = _rowArray.OrderByDescending(r => Parse<int?>(r[columnIndex].ToString())).ToArray(); 
          break; 
         case "datetime": 
          _rowArray = _rowArray.OrderByDescending(r => Parse<DateTime?>(r[columnIndex].ToString())).ToArray(); 
          break; 
         default: 
          _rowArray = _rowArray.OrderByDescending(r => r[columnIndex].ToString()).ToArray(); 
          break; 
        } 
       } 
       catch (Exception ex) 
       { 
        throw new Exception("Cannot sort on the data type '" + dataType.Name + "'", ex); 
       }      
      } 

      dataGridView1.Refresh(); 
      ApplyRowDefinitions(); 
      GC.Collect(); 
     }