7 Stimmen

Sortieren in einem GridView mit ObjectDataSource mit TemplateFields

Hintergrund:

Ich arbeite mit einem GridView und einer ObjectDataSource. Ich implementiere Paging und Sortierung.

Auf der ObjectDataSource:

        objectDataSource.TypeName = value;
        objectDataSource.SelectMethod = "Select";
        objectDataSource.SelectCountMethod = "SelectCount";
        objectDataSource.SortParameterName = "sortExpression";
        objectDataSource.EnablePaging = true;

In der GridView:

        gridView.AllowPaging = true;
        gridView.AllowSorting = true;
        gridView.DataSource = objectDataSource;

Damit das Blättern und Sortieren funktioniert, habe ich "EnableSortingAndPagingCallbacks" auf True gesetzt. Vorher bekam ich eine "System.Web.HttpException: The GridView fired event Sorting which wasn't handled." und dies behebt es.

Wenn ich nur BoundFields in meinem GridView verwende, ist dies großartig und funktioniert gut.

Wenn ich jedoch TemplateFields verwende, erhalte ich eine "NotSupportedException: Callbacks werden bei TemplateFields nicht unterstützt, da einige Steuerelemente in einem Callback nicht richtig aktualisiert werden können. Turn callbacks off on GridView."

Das macht Sinn. Ich muss nur wissen, wie man die Sortierung arbeiten, ohne EnableSortingAndPagingCallbacks zu machen.

Wenn EnableSortingAndPagingCallbacks = True:

  • Paging funktioniert
  • Sortierarbeiten
  • BoundFields Arbeit
  • TemplateFields tun Nicht Arbeit

Wenn EnableSortingAndPagingCallbacks = False:

  • Paging funktioniert
  • Die Sortierung erfolgt Nicht Arbeit
  • BoundFields Arbeit
  • TemplateFields Arbeit

Meine Frage:

Wie bekomme ich Paging, Sortierung und TemplateFields gleichzeitig zum Laufen?


Klärung der Umsetzung:

Die Verwendung einer ObjectDataSource mit einem GridView erfordert die Implementierung einer Methode namens Select, die einen Sortierausdruck, die Anzahl der zurückzugebenden Zeilen und die Startzeile liefert:

    public IEnumerable<CountyAndStateGridRow> Select(string sortExpression, int maximumRows, int startRowIndex)
    {
        string oql = "select County order by {" + sortExpression + "}" ;

        var counties = QueryProvider.ExecuteQuery(oql).Cast<County>();

        var page = counties.Skip(startRowIndex).Take(maximumRows);

        var rows = page.Select(
            county => new CountyAndStateGridRow
            {
                CountyName = county.Name,
                StateName = county.State.Name,
            });

        return rows;
    }

Die spezifische SortExpression wird in der aspx/ascx definiert:

<Columns>
       <asp:BoundField HeaderText="County Name" DataField="CountyName" SortExpression="Name" />
       <asp:BoundField HeaderText="State Name" DataField="StateName" SortExpression="State.Name" />
</Columns>

Dies ist sollen übergeben werden und rufen Sie die Select-Methode auf der ObjectDataSource, wenn die Spalte angeklickt wird, aber es scheint nicht zu funktionieren, wenn EnableSortingAndPagingCallbacks = true, und stattdessen erhalte ich die Ausnahme über das Sorting-Ereignis nicht definiert ist.

1voto

dh_tech Punkte 1

Damit die Sortierfunktion funktioniert:

 <asp:GridView GridView ID="GvCountryDetails" AllowPaging="True" 
OnPageIndexChanging="GvCountryDetails_PageIndexChanging" AllowSorting="True" 
onsorting="GvCountryDetails_Sorting">

in der .cs-Datei müssen Sie Folgendes schreiben

protected void GvCountryDetails_PageIndexChanging(object sender, GridViewPageEventArgs e)
    {
        GvCountryDetails.PageIndex = e.NewPageIndex;
        isPageIndexChanged = true;
        BindData();
    }

protected void GvCountryDetails_Sorting(object sender, GridViewSortEventArgs e)
    {
        sortExpression = e.SortExpression;
        isPageIndexChanged = false;
        BindData();
    }
    private void SortGridData()
    {
        string sSortdir;
        if (isPageIndexChanged == true)
        {
            sSortdir = ViewState["SortDirection"] as string;
        }
        else
        {
            sSortdir = GetSortDirection(sortExpression);
        }

        string sSortExp = sortExpression;

        if (sSortdir == "ASC")
        {
            lstCountryDetails = Sort<Country>(lstCountryDetails, sSortExp, SortDirection.Ascending);
        }
        else
        {
            lstCountryDetails = Sort<Country>(lstCountryDetails, sSortExp, SortDirection.Descending);
        }
    }

    private List<CountryBO> Sort<TKey>(List<CountryBO> list, string sortBy, SortDirection direction)
    {
        PropertyInfo property = list.GetType().GetGenericArguments()[0].GetProperty(sortBy);
        if (direction == SortDirection.Ascending)
        {
            return list.OrderBy(e => property.GetValue(e, null)).ToList<CountryBO>();
        }
        else
        {
            return list.OrderByDescending(e => property.GetValue(e, null)).ToList<Country>();
        }
    }

    private string GetSortDirection(string column)
    {
        string sortDirection = "ASC";
        string sortExpression = ViewState["SortExpression"] as string;
        if (sortExpression != null)
        {
            if (sortExpression == column)
            {
                string lastDirection = ViewState["SortDirection"] as string;
                if ((lastDirection != null) && (lastDirection == "ASC"))
                {
                    sortDirection = "DESC";
                }
            }
        }

        ViewState["SortDirection"] = sortDirection;
        ViewState["SortExpression"] = column;
        return sortDirection;
    }

0voto

Zensar Punkte 817

Die Eigenschaft EnableSortingAndPagingCallbacks weist das Steuerelement an, eine clientseitige Sortierung der Daten vorzunehmen, so dass das Steuerelement automatisch zu sortieren scheint, ohne dass ein Postback der Seite erforderlich ist. TemplateFields werden mit dieser Methode nicht unterstützt. Um TemplateFields zu verwenden und eine Sortierung durchzuführen, müssen Sie das GridView.Sorting-Ereignis verdrahten und die Eigenschaft AllowSorting auf true setzen. Sobald dies geschehen ist, sollte das Ereignis ausgelöst werden, wenn die Spaltenüberschrift angeklickt wird, und die Sortierlogik kann von dort aus verarbeitet werden.

1 Stimmen

Die Seite macht einen Aufruf an den Server, wenn EnableSortingAndPagingCallbacks auf True gesetzt ist (d.h. es ist nicht rein clientseitig). Wenn ich auf eine sortierbare Spalte klicke, wird die Select-Methode auf der Datenquelle, die von ObjectDataSource angegeben wird, tatsächlich mit dem Spaltennamen als sortExpression-Parameter aufgerufen, der dann in eine Abfrage mit einem "order by" in meinem Code umgewandelt wird.

0voto

Requette Punkte 1

Ändern Sie den Wert von SortExpression mit dem Wert von DataField. Setzen Sie AllowPaging und AllowSorting auf true. Setzen Sie EnableSortingAndPagingCallbacks auf true.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X