3

データベースからのデータがDataSet. 次に、DataSourceを実行する前に、グリッド コントロールのとして設定しDataBind()ます。DataSet/DataTableを1列でソートしたい。列はデータベースでソートするには複雑すぎますが、デリゲートを使用して一般的なリストをソートするようにソートできることを望んでいました。

これは可能ですか、それとも別のデータ構造に転送する必要がありますか?

編集私は.Net 2.0を使用しているため、これらの答えを得ることができません。

4

7 に答える 7

6

DataTable (および DataView) の並べ替えのしくみのため、デリゲート アプローチを直接使用することはできません。1 つの回避策は、順序を表すデータ テーブルに列を追加し、目的の順序に基づいて (行ごとに) 値を設定することです。次に、この新しい列のビューに並べ替えを追加できます。例(簡潔にするために、LINQを使用してソートを行います):

var sorted = table.Rows.Cast<DataRow>().OrderBy(row => your code);
int sequence = 0;
foreach(var row in sorted)
{
    row["sequence"] = sequence++;
}

(型指定されたデータセットがある場合、Cast ステップは必要ないと思います。または、型指定された DataRow サブクラスを使用します)

[2.0を含めるように編集]

2.0 (つまり、LINQ などを使用しない) では、 a を使用List<T>して並べ替えを行うことができました。

        List<DataRow> sorted = new List<DataRow>();
        foreach(DataRow row in table.Rows)
        {
            sorted.Add(row);
        }
        sorted.Sort(delegate(DataRow x, DataRow y) { your code });
        int sequence = 0;
        foreach(DataRow row in sorted)
        {
            row["sequence"] = sequence++;
        }

(ここでも、型指定されたデータセットを使用している場合は DataRow に置き換えてください)

于 2008-10-23T07:54:13.137 に答える
3

DataView.Sortプロパティが役立つと思います。DataTable.DefaultViewからアクセスできます。

于 2008-10-23T07:50:21.943 に答える
2

コントロールでページング/ソートを失うことを気にしない場合は、次のようなものを使用できます。

var dt = new DataTable();
gvWhatever.DataSource = dt.Select().ToList().Sort();

そして、その並べ替えはオーバーロードごとに IComparables などを取るので、好きなように並べ替えることができます。

于 2008-10-23T07:52:25.030 に答える
1

あなたはそれを行うことができます

myTableName.DefaultView.Sort = "MyFieldName DESC";
于 2009-04-17T13:04:44.303 に答える
1
protected void grdResult_Sorting(object sender, GridViewSortEventArgs e)
    {
        DataTable dt = ((DataTable)Session["myDatatable"]);
        grdResult.DataSource = dt;
        DataTable dataTable = grdResult.DataSource as DataTable;

    //Code added to fix issue with sorting for Date datatype fields
    if (dataTable != null)
    {   

        DataView dataView = new DataView(dataTable);
        for (int i = 0; i < dataView.Table.Rows.Count; i++)
        {
            try
            {
                dataView.Table.Rows[i]["RESP_DUE_DT"] = common.FormatDateWithYYYYMMDD(Convert.ToDateTime(dataView.Table.Rows[i]["RESP_DUE_DT"]));
                dataView.Table.Rows[i]["RECD_DT"] = common.FormatDateWithYYYYMMDD(Convert.ToDateTime(dataView.Table.Rows[i]["RECD_DT"]));
            }
            catch (Exception ex)
            {

            }
        }

        dataView.Sort = "[" + e.SortExpression + "]" + " " + GetSortDirection(e.SortExpression);

        for (int i = 0; i < dataView.Table.Rows.Count; i++)
        {
            try
            {
                dataView.AllowEdit = true;
                dataView[i].BeginEdit();
                dataView[i]["RESP_DUE_DT"] = common.FormatDateFromStringYYYYMMDD(dataView[i]["RESP_DUE_DT"].ToString());
                dataView[i]["RECD_DT"] = common.FormatDateFromStringYYYYMMDD(dataView[i]["RECD_DT"].ToString());
            }
            catch (Exception ex)
            {

            }
        }
        //End code added to fix the issue with sorting for Date data type fields


        grdResult.DataSource = dataView;
        grdResult.DataBind();


    }
}
于 2010-10-14T16:30:38.353 に答える
0

データベースで列を並べ替えるのが複雑なのはなぜですか? もちろんそれが計算列でない限り、データベースでもフレームワークでもソートの複雑さは同じであると仮定します。その場合でも、DBでのソートはまだ高速であると推測しています。

ただし、ジョンが言ったように、DataView.Sort プロパティを使用してフォーム レベルで並べ替えを変更できます。時間がかかりすぎる場合は、これを行うことをお勧めします。その場合、結果をキャッシュすると便利です。

于 2008-10-23T11:49:15.423 に答える
0

データベースをメモリ内でソートできますが、「複雑すぎてデータベース内でソートできない」とはどういうことかわかりません。私があなただったら、データベースでソートして、ビュー、冗長性インデックス、複雑な SQL ステートメントを使用しようとします。おそらく、メモリ内の大きなデータセットをソートするよりも高速であり、他のデータセットのソートを維持するという利点がありますクライアントの種類 (例: Web サービスなど)

于 2008-10-23T11:21:45.853 に答える