DataBindを実行する前にDataSetをソートするにはどうすればよいですか?
-
04-07-2019 - |
質問
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";