Databind를 수행하기 전에 데이터 세트를 어떻게 정렬 할 수 있습니까?
-
04-07-2019 - |
문제
데이터베이스에서 나오는 데이터가 DataSet
. 그런 다음 THE로 설정했습니다 DataSource
하기 전에 그리드 컨트롤의 DataBind()
. 나는 정렬하고 싶다 DataSet
/DataTable
한 열에. 열은 데이터베이스에서 정렬하기 위해 복잡해야하지만 DeliGate를 사용하여 일반적인 목록을 정렬하는 것처럼 정렬 할 수 있기를 바랐습니다.
이것이 가능합니까 아니면 다른 데이터 구조로 전송해야합니까?
편집하다 나는이 답변을 나를 위해 일할 수 없다. 나는 사용하고 있기 때문에 생각한다. .NET 2.0.
해결책
DataTable (및 Dataview) 정렬 작동 방식으로 인해 대의원 접근 방식을 직접 사용할 수 없습니다. 하나의 해결 방법은 순서를 나타내는 데이터 테이블에 열을 추가하고 원하는 시퀀스에 따라 값 (행당)을 설정하는 것입니다. 그런 다음이 새 열의보기에 정렬을 추가 할 수 있습니다. 예를 들어 (간결함을 위해 LINQ를 사용하여 종류를 사용) :
var sorted = table.Rows.Cast<DataRow>().OrderBy(row => your code);
int sequence = 0;
foreach(var row in sorted)
{
row["sequence"] = sequence++;
}
(입력 된 데이터 세트가있는 경우 캐스트 단계가 필요하지 않다고 생각하거나 타이핑 된 데이터 로우 서브 클래스를 사용할 것입니다).
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++;
}
(유형 데이터 세트를 사용하는 경우 데이터를 대체합니다)
다른 팁
제 생각에는 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();
}
}
데이터베이스를 메모리로 정렬 할 수는 있지만 "데이터베이스에서 정렬하기에는 너무 복잡한 것"이 무엇인지 모르겠습니다. 내가 당신이라면 데이터베이스에서 정렬하고보기, 중복 인덱스, 복잡한 SQL 문을 사용하려고 노력할 것입니다. 아마도 큰 데이터 세트를 메모리에 정렬하는 것보다 더 빠를 것입니다. 종류의 고객 (예 : 웹 서비스 등)
왜 열이 있습니다 데이터베이스에 정렬하기 위해 복잡합니다? 물론 계산 된 열이 아니라면, 데이터베이스의 복잡성이 데이터베이스 또는 프레임 워크에서 동일하다고 가정합니다.이 경우에도 DB의 정렬이 여전히 더 빠르다고 추측합니다.
그러나 John이 말했듯이 Dataview.Sort 속성을 통해 양식 레벨에서 정렬을 변경할 수 있습니다. 시간이 너무 많은 경우이 작업을 수행하는 것이 좋습니다.이 경우 결과를 캐시하는 것이 유용 할 것입니다.
당신은 그것을 할 수 있습니다
myTableName.DefaultView.Sort = "MyFieldName DESC";