Frage

Ich habe Daten aus der Datenbank in Form eines DataSet kommen. Ich stelle es dann als DataSource eine Gittersteuerung, bevor Sie eine DataBind() tun. Ich möchte die DataSet / DataTable auf einer Spalte sortieren. Die Säule zu komplex ist in der Datenbank zu sortieren, aber ich habe gehofft, dass ich es sortieren könnte, wie ich eine generische Liste sortieren würde das heißt eine deligate verwendet wird.

Ist das möglich oder muss ich es auf eine andere Datenstruktur übertragen?

Bearbeiten Ich kann nicht von dieser Antwort bekommt für mich zu arbeiten, ich glaube, weil ich verwende .Net 2.0.

War es hilfreich?

Lösung

Weil, wie Datatable (und Dataview) Sortierarbeiten, können Sie nicht die Delegierten Ansatz direkt verwenden. Eine Abhilfe ist eine Spalte der Datentabelle hinzuzufügen, die die Reihenfolge darstellt, und den Wert (pro Zeile) auf der Grundlage der gewünschten Sequenz. Sie können dann eine Sortierung nach dem Blick auf diese neue Spalte hinzuzufügen. Zum Beispiel (unter Verwendung von LINQ, die Art zu tun, nur der Kürze halber):

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

(wenn Sie einen typisierten Datensatz haben, dann denke ich nicht das Cast-Schritt benötigen, oder würden Sie Ihre typisierte DataRow Unterklasse verwenden)

[Bearbeiten schließen 2.0]

2.0 (das heißt ohne LINQ etc.) können Sie eine List<T> nutzen, um die Art zu tun - etwas langatmig, aber:

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

(wieder Ersatz DataRow, wenn Sie einen typisierten Datensatz verwenden)

Andere Tipps

Ich denke, DataView.Sort Eigenschaft würde helfen. Sie können darauf zugreifen durch DataTable.DefaultView .

Wenn Sie nichts dagegen nicht Paging verlieren / Sortieranlagen über die Kontrolle Sie so etwas wie verwenden können:

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

Und diese Art nehmen IComparables usw. gemäß den Überlastungen, so dass Sie aber sortieren Sie mögen.

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


    }
}

Sie können die Datenbank im Speicher sortieren, aber ich weiß nicht, was „zu komplex in der Datenbank zu sortieren“ wäre. Wenn ich Sie wäre, würde ich versuchen, es in der Datenbank sortiert zu bekommen, verwenden Sie Views, Redundancy Indizes, komplexe SQL-Anweisungen, es ist wahrscheinlich schneller sein würde als eine große Datensatz in Speichersortieren, mit dem zusätzlichen Vorteil, dass sie die Art für andere hält Art von Kunden (zB Web Services, etc.)

Warum ist die Spalte zu komplex in der Datenbank zu sortieren ? Es nehme die Komplexität der Art wird das gleiche in der Datenbank oder im Rahmen sein, es sei denn natürlich ist es eine berechnete Spalte, und auch in diesem Fall vermute ich, dass in der DB ist die Sortierung noch schneller.

Doch wie John sagte, können Sie die Sortierung auf Formularebene über DataView.Sort Eigenschaft ändern. Ich würde empfehlen, dies zu tun, wenn die zu viel zeitaufwendig, und es diesen Fall wäre es sinnvoll sein, um die Ergebnisse zu cachen.

Sie können es tun, indem

myTableName.DefaultView.Sort = "MyFieldName DESC";
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top