0

我有一个 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";        

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

4

2 回答 2

1

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

_rowArray = _rowArray.OrderBy(r => int.Parse(r[columnIndex])).ToArray();
于 2012-10-19T09:51:58.923 回答
0

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

我使用了另一个线程的 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();
        }
于 2012-10-19T11:22:13.293 回答