質問

DataSetの形式でデータベースからデータを取得しています。次に、DataSourceを実行する前に、グリッドコントロールのDataBind()として設定します。 1つの列でDataTable / <=>をソートします。データベース内で列を並べ替えるのは複雑ですが、一般的なリストを並べ替えるのと同じように、つまりデリゲートを使用して並べ替えることができることを望んでいました。

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

編集これらの答えを自分で使用することはできません。 .Net 2.0を使用しているためだと思います。

役に立ちましたか?

解決

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++;
}

(型付きデータセットがある場合、キャストステップは必要ないと思うか、型付きDataRowサブクラスを使用します)

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

2.0(つまり、LINQなどを使用しない)では、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を置き換えます)

他のヒント

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

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

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

このソートでは、オーバーロードごとにIComparablesなどが使用されるため、好きなようにソートできます。

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


    }
}

メモリ内でデータベースをソートできますが、データベースでソートするには<!> quot;複雑すぎる<!> quot;だろう。もし私があなたなら、ビュー、冗長性インデックス、複雑なSQLステートメントを使用してデータベースでソートしようとしますが、おそらくメモリ内の大きなデータセットをソートするよりも速くなります。クライアントの種類(Webサービスなど)

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

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

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

myTableName.DefaultView.Sort = "MyFieldName DESC";
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top