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.