2012-10-19 51 views
0

我有一個DataGridView,它包含從數據庫上的存儲過程返回的數據。每個返回值的列都不相同,因此不要使用強類型名稱。我目前正在努力訂購這些,因爲數字列是按字符串排序的,例如。 1→10→11→15→2→25→3,而不是按價值。我已確認列的ValueType設置正確。我曾嘗試這樣的:OrderBy命名索引

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

其中_rowArray是數據行的陣列,和是在DataGridView的DataSource,和columnIndex是哪一列在_rowArray用戶想要通過訂購一個整數變量指定。在調試時,我可以看到sortedRows按照相同的順序保存了與_rowArray相同的序列,緊跟在LINQ語句之後。我也曾嘗試:

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

,並試圖建立一個數據視圖(視圖),這樣做:

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

...但是這並沒有奏效。任何人提供任何見解?

回答

1

你有沒有嘗試解析字符串爲int之前訂購?

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

呈現其自身的問題。首先,它們可以是任何價值類型,而不僅僅是整數。其次,他們可能是空的。另外,我需要在解析爲Double,int等之前將r [columnIndex]強制轉換爲字符串。 – MrShoes

+0

好吧,如果您不知道值類型,那麼您不能簡單地期望它被按整數排序: )。另一種方法是使用比較器對舊的方式進行排序。 –

+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(); 
     }