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 内のどの列でユーザーが注文するかを指定する整数変数です。デバッグ中に、LINQ ステートメントの直後に、sortedRows が _rowArray と同じシーケンスを同じ順序で保持していることがわかります。私も試しました:

_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 に答える