문제

데이터베이스에서 나오는 데이터가 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";
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top