を含む GridView があり、ObjectDataSource
それを並べ替えられるようにしたいと考えています。
ページングは正しく機能しますが、並べ替えでは例外が発生します。
GridView
gridView
は、処理されなかった並べ替えイベントを発生させました。
サーバー側で並べ替えを有効にするにはどうすればよいですか?
(つまり、gridView.EnableSortingAndPagingCallbacks
false のままにする必要があります)
を含む GridView があり、ObjectDataSource
それを並べ替えられるようにしたいと考えています。
ページングは正しく機能しますが、並べ替えでは例外が発生します。
GridView
gridView
は、処理されなかった並べ替えイベントを発生させました。
サーバー側で並べ替えを有効にするにはどうすればよいですか?
(つまり、gridView.EnableSortingAndPagingCallbacks
false のままにする必要があります)
gridView.AllowSorting プロパティを true に設定します。ここから、IBindingList を実装するオブジェクトを使用している場合、グリッドはポストバック時にデータを自動的にソートできるようにする必要があります。ただし、そうではない可能性が高いため、上記の TheTXI のアドバイスに従って、並べ替えイベントを自分で処理する必要があります。次のように、分離コードで GridView.Sorting イベントを配線します。
gridView.Sorting += new GridViewSortEventHandler(gridView_Sorting);
次のように、gridView_Sorting メソッド内で並べ替えを処理します。
private void gridView_Sorting(object sender, GridViewSortEventArgs e)
{
//Sorting logic here
}
また、コントロールにアタッチされた OnSort="gridView_Sorting" を使用して、ページ自体にイベントを接続することもできます。
gridView.EnableSortingAndPagingCallbacks を false に設定しているため、ユーザーが並べ替えを試みてもすぐには起動されず、サーバーへのポストバックを待機することに注意してください。
これが役立つことを願っています!
編集:
ObjectDataSource は選択の仲介者のように思われるので、ここでは並べ替えの配線についても簡単に説明します。ページで次を使用します (完全な例は、MSDN の下部にあります) 。
<asp:GridView ID="TestGridView" runat="server" DataSourceID="ObjectDataSourceTest"
AllowSorting="True">
</asp:GridView>
<asp:ObjectDataSource ID="ObjectDataSourceTest" runat="server"
SelectMethod="SelectMethod"
TypeName="Samples.AspNet.CS.SortingData"
SortParameterName="sortExpression">
</asp:ObjectDataSource>
gridView.Sorting イベントを実際に使用する代わりに、ObjectDataSource にジャンプして並べ替えを処理します。並べ替えがトリガーされると、コード ビハインドの SelectMethod にあるメソッドを呼び出す必要があります。次に、SelectMethod 内で、次のように GridView オブジェクトの再構築を処理します。
public void SelectMethod(string sortExpression)
{
//Rebuild gridView table if necessary, same method used in
//on a postback, and retrieve data from the database. Once
//completed sort the data with:
gridView.Sort(sortExpression, SortDirection.(Ascending or Descending))
}
私は Linq2Sql と ObjectDataSource を使用しており、ページングと並べ替えが非常にうまく機能します。
ObjectDataSource として使用する Class を実装しました。これには、 Linq2SQLクエリを使用して DB からデータを取得するビジネス レイヤーを呼び出す Select メソッドと Count メソッドがあります。select メソッドは、最初のアイテム インデックス、ページ サイズ、および並べ替え式をパラメーターとして自動的に取得します。
public List<EntityClass> Select(int startIndex, int pageSize, string sortBy) {}
public int Count() {}
ASPX では、DataSource は次のように構成されます。
<asp:ObjectDataSource ID="ObjectDataSource1" runat="server"
SelectMethod="Select" EnablePaging="true"
StartRowIndexParameterName="startIndex"
MaximumRowsParameterName="pageSize"
SortParameterName="sortBy" SelectCountMethod="Count" >
</asp:ObjectDataSource>
Select メソッドと Count メソッドは、Linq クエリを使用して DB からデータを取得します。Skip()、Take()、Orderby()メソッドを使用します。OrderBy が文字列の並べ替え式を受け入れるようにするには、DynamicLinqを使用します。コーディングする必要はほとんどありません。データバインディング、ページング、および並べ替えは自動的に機能します。
SortExpression
呼び出すデータ アクセス層のメソッドを渡して、StoredProcedure
ウェイ SP の下に記述し、SQL での並べ替えを処理します。このようにして、ソートのパフォーマンスを向上させることができます。
データベース SP:
Select ROW_NUMBER() OVER(ORDER BY '+@sortExpression +' ) as RowNum
,* from (SELECT CUSTOMERID,
LEDGERDESCRIPTION,
CustomerDescription as CustomerName
WHERE REGIONID ='''+@RegionID+''')t
order by RowNum'
OrderBy
選択した列でこれを使用するためにLINQを使用できます。次のようにします。
public static List<YourDataObject> GetSortedData(string orderBy)
{
List<YourDataObject> sortedDataList = new List<YourDataObject>();
switch (orderBy)
{
case "Col1": sortedEmployeeList = GetDefaultObjects().OrderBy(x => x.Col1).ToList();
break;
case "Col2":
//Do this for all columns
default:
sortedEmployeeList = GetDefaultObjects();
break;
}
return sortedEmployeeList;
}
これはSelect
、オブジェクト データ ソースのメソッドで行われます。
GridView で、並べ替えキーを追加します。SelectParameter
オブジェクト データ ソースに「orderBy」を追加します。
<asp:GridView AllowSorting="true" DataSourceID="objDsAllObjects" ....>
<Columns>
<asp:BoundField SortExpression="Col1"/>
<!-- Do this for all columns -->
</Columns>
</asp:GridView >
<asp:ObjectDataSource ID="objDsAllObjects" SortParameterName="orderBy" runat="server"
SelectMethod="GetAllEmployees" TypeName="YourObjectClass"></asp:ObjectDataSource>
DALレイヤーとストアドプロシージャを変更せずにうまくいきました。