2012-10-19 47 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(); 
     }