【问题标题】:OrderBy named indexOrderBy 命名索引
【发布时间】:2012-10-19 09:48:31
【问题描述】:

我有一个 DataGridView,它保存从数据库上的存储过程返回的数据。每个返回值的列都不同,因此没有强类型名称。我目前正在努力订购这些,因为数字列被订购为字符串,例如。 1 -> 10 -> 11 -> 15 -> 2 -> 25 -> 3,而不是按值。我已经确认列的 ValueType 设置正确。我试过这个:

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

其中 _rowArray 是一个 DataRows 数组,是 DataGridView 的 DataSource,columnIndex 是一个整数变量,用于指定用户想要排序的 _rowArray 中的哪一列。在调试时,我可以看到 sortedRows 与 _rowArray 的顺序相同,紧跟在 LINQ 语句之后。我也试过:

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

并已尝试创建 DataView(视图)并完成此操作:

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

...但这并没有奏效。有人提供任何见解吗?

【问题讨论】:

    标签: c# linq sorting datagridview


    【解决方案1】:

    您是否尝试在订购之前将字符串解析为 int?

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

    【讨论】:

    • 这也带来了自己的问题。首先,它们可以是任何值类型,而不仅仅是整数。其次,它们可能为空。另外,在解析为 Double、int 等之前,我需要将 r[columnIndex] 转换为字符串。
    • 好吧,如果你不知道值类型,你不能简单地期望它被排序为整数:)。另一种选择是使用比较器以旧方式进行排序。
    • 我可以使用 var dataType = dataGridView1.Columns[columnIndex].ValueType; 获取数据类型;
    • 我的意思是不是每个值类型都可以映射到一个整数值(当然除非你散列它们)。根据 ValueType,您很可能需要不同的排序方法。
    • 好的。我已尝试将以下内容作为哈希并确认数据案例“双”语句是正确的,但由于字符串格式不正确(即 null),我遇到了异常。 var dataType = dataGridView1.Columns[columnIndex].ValueType; switch (dataType.Name.ToLower()) { case "double": _rowArray = _rowArray.OrderBy(r => double.Parse(r[columnIndex].ToString())).ToArray();休息; }
    【解决方案2】:

    感谢 lcfseth 的帮助,以及线程 here,我已经解决了这个问题,虽然它很丑。

    我使用了其他线程的 Parse 方法:

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

    【讨论】:

      猜你喜欢
      • 2014-09-26
      • 1970-01-01
      • 1970-01-01
      • 2013-11-19
      • 2019-07-28
      • 1970-01-01
      • 2012-08-01
      相关资源
      最近更新 更多