Frage

Ich kann nicht meinen Gridview, damit einen Benutzer eine Spalte mit Daten sortieren, wenn ich eine benutzerdefinierte SqlDataSource bin mit.

Ich habe eine Gridview, in dem der Code in der ASP-Referenz im HTML es ist minimal:

<asp:GridView id="grid" runat="server" AutoGenerateColumns="False" AllowSorting="True">
</asp:GridView>

Im Code-behind befestige ich eine dynamisch erstellten SqlDataSource (die Spalten enthalten ist nicht immer gleich so die verwendete SQL es schaffen wird zur Laufzeit aufgebaut). Zum Beispiel:

stelle ich die Spalten nach oben ...

BoundField column = new BoundField();
column.DataField = columnName;
column.HeaderText = "Heading";
column.SortExpression = columnName;

grid.Columns.Add(column);

die Datenquelle ...

SqlDataSource dataSource = new SqlDataSource(
    "System.Data.SqlClient",
    connectionString, 
    generatedSelectCommand);

dann die gridview ...

grid.DataSource = dataSource;
grid.DataKeyNames = mylistOfKeys;
grid.DataBind();

Im Moment passiert nichts, wenn ein Benutzer auf eine Spaltenüberschrift klickt, wenn ich erwarten würde es die Spaltendaten zu sortieren. Wer irgendwelche Ideen, was ich bin fehlt?

Wenn es eine schönere Art und Weise, dies zu tun, die hilfreich sein würden zu mir an dieser unordentlich aussieht!

War es hilfreich?

Lösung

Als erstes müssen Sie ein Ereignis hinzuzufügen:

<asp:GridView AllowSorting="True" OnSorting="gvName_Sorting" ...

Dann das Ereignis wie folgt aussieht:

protected void gvName_Sorting( object sender, GridViewSortEventArgs e )
{
    ...
    //rebind gridview
}

Sie müssen im Grunde wieder Ihre Daten.

Sie haben Recht, dass es chaotisch aussieht, und es gibt einen besseren Weg: ASP.Net MVC

Leider ist das eine drastisch andere Seite Modell.

Andere Tipps

Sie können auch neu zuweisen nur die datasource.SelectCommand vor dem DataBind () -Aufruf in den Sorting-Handler. So etwas wie folgt aus:

protected void gvItems_Sorting(object sender, GridViewSortEventArgs e)
{
    GridView gv = (GridView)sender;
    SqlDataSource ds = (SqlDataSource)gv.DataSource;
    ds.SelectCommand = ds.SelectCommand + " order by " 
        + e.SortExpression + " " + GetSortDirection(e.SortDirection);
    gvItems.DataSource = ds;
    gvItems.DataBind();
}

string GetSortDirection(string sSortDirCmd)
{
    string sSortDir;
    if ((SortDirection.Ascending == sSortDirCmd))
    {
        sSortDir = "asc";
    }
    else
    {
        sSortDir = "desc";
    }
    return sSortDir;
}

Ich hoffe, dass diese Hilfe. Lassen Sie uns wissen, wenn Sie zusätzliche Hilfe benötigen, sie umzusetzen.

Genießen Sie!

Ich bin über diese nicht sicher, aber wenn Sie einen Standard SqlDataSource verwenden und Sie auf einem Feld klicken nach diesem Feld zu sortieren, wird die SqlDataSource wieder mit den Daten gefüllt, und es ist an das Netz Rebound. So ist die Sortierung nicht auf der Client-Seite passiert und kann auch nur dann erfolgen, wenn die Select des SQLDataSource nicht Datareader ist.

Wenn die Sortier Event-Handling, erschafft man die SqlDataSource und Zugstufe es auf die Gridview? Können Sie das Sortierfeld und Richtung zum generatedSelectCommand setzen, die Sie verwenden? Oder setzen sie auf die SortParameterName Eigenschaft des SQLDataSource?

Ich bin absolut sicher, dass Sie die SqlDataSource an das Netz Rebound haben, und da Sie es on the fly zu erstellen, müssen Sie es wieder füllen.

Besser spät als nie?

Einige zusätzlich für Keith Vorschlag, die im Grunde die richtige ist.

Die Wahrheit ist, dass Sie mit Sortierung auf gridView_Sorting Ereignis zu tun haben. Es besteht keine Notwendigkeit zu DataBind () der Gridview früher, zum Beispiel in Page_Load Ereignisse. Es sollten nur die GridView.Sort () -Methode aufrufen, statt .DataBind (). Hier ist, wie es geht:

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

    If Not IsPostBack Then

        Me.gridView.Sort(Request.QueryString("sortExpression"), Request.QueryString("sortDirection"))

    End If

End Sub

Als nächstes wollen wir einen Blick auf gridView_Sorting Ereignis.

Sie haben dort die Datenquelle die richtige Sortierung zu drücken. Gridview selbst nicht, dass Griff (in diesem Fall zumindest).

Protected Sub gridView_Sorting(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewSortEventArgs) Handles gridView.Sorting
    If IsPostBack Then
        e.Cancel = True
        Dim sortDir As SortDirection = SortDirection.Ascending
        If e.SortExpression = Me.Q_SortExpression And Me.Q_SortDirection = SortDirection.Ascending Then
            sortDir = SortDirection.Descending
        End If
        RedirectMe(e.SortExpression, sortDir)
    Else
        Dim sortExpr As String = e.SortExpression + " " + IIf(e.SortDirection = SortDirection.Ascending, "ASC", "DESC")
        Dim dv As System.Data.DataView = Me.dsrcView.Select(New DataSourceSelectArguments(sortExpr))
        Me.gridView.DataSource = dv
        Me.gridView.DataBind()
    End If
End Sub

keine Notwendigkeit zu kodieren in Datenquelle jede Sortierfunktionalität wie vorbei zu Stored Procedure Sortierparametern. Alle Sortierung erfolgt in den oben genannten Code-Teilen.

Darüber hinaus ist es gut, die gridView.EnableViewState auf False hat geschaltet, die die Seite verursacht viel leichter für den Netzwerkverkehr und für den Browser als auch zu sein. Kann das tun, wie das Gitter vollständig, wenn die Seite zurück ist neu erstellt veröffentlichen.

Haben

einen schönen Tag!

Martin

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top