バックグラウンド:
私はGridViewとObjectDataSourceを使用しています。ページングと並べ替えを実装しています。
ObjectDataSourceの場合:
objectDataSource.TypeName = value;
objectDataSource.SelectMethod = "Select";
objectDataSource.SelectCountMethod = "SelectCount";
objectDataSource.SortParameterName = "sortExpression";
objectDataSource.EnablePaging = true;
GridViewの場合:
gridView.AllowPaging = true;
gridView.AllowSorting = true;
gridView.DataSource = objectDataSource;
ページングと並べ替えを機能させるために、「EnableSortingAndPagingCallbacks」をTrueに設定しました。以前、「System.Web.HttpException:処理されなかったGridView起動イベントSorting」が発生していました。そしてこれはそれを修正します。
GridViewでBoundFieldsのみを使用する場合、これは素晴らしく、正常に機能します。
ただし、TemplateFieldsを使用した場合、「NotSupportedException:一部のコントロールがコールバックで正しく更新できないため、コールバックはTemplateFieldでサポートされていません。GridViewでコールバックをオフにしてください。」が表示されます。
これは理にかなっています。EnableSortingAndPagingCallbacksを使用せずに、並べ替えを機能させる方法を知る必要があります。
EnableSortingAndPagingCallbacks = Trueの場合:
- ページングワークス
- 仕分け作業
- BoundFieldsは機能します
- TemplateFieldsが機能しない
EnableSortingAndPagingCallbacks = Falseの場合:
- ページングワークス
- 並べ替えが機能しない
- BoundFieldsは機能します
- TemplateFieldsは機能します
私の質問:
Paging、Sorting、およびTemplateFieldsをすべて同時に機能させるにはどうすればよいですか?
実装の明確化:
GridViewでObjectDataSourceを使用するには、ソート式、返される行数、および開始行を提供するSelectというメソッドを実装する必要があります。
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;
}
特定のSortExpressionは、aspx/ascxで定義されています。
<Columns>
<asp:BoundField HeaderText="County Name" DataField="CountyName" SortExpression="Name" />
<asp:BoundField HeaderText="State Name" DataField="StateName" SortExpression="State.Name" />
</Columns>
これは、列がクリックされたときに渡され、ObjectDataSourceのSelectメソッドを呼び出すことになっていますが、EnableSortingAndPagingCallbacks = trueの場合は機能しないようで、代わりに、Sortingイベントが定義されていないという例外が発生します。