我有一个带有ObjectDataSource
的GridView,我希望能够对其进行排序。
分页工作正常,但排序给了我一个例外:
GridView
gridView
已触发的事件排序未处理。
如何在服务器端启用排序?
(即gridView.EnableSortingAndPagingCallbacks
必须保持为假)
答案 0 :(得分:19)
将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上找到完整示例here,靠近底部):
<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))
}
答案 1 :(得分:7)
我正在使用Linq2Sql和ObjectDataSource,它可以很好地进行分页和排序。
我实现了一个用作ObjectDataSource的Class。它有一个Select和Count方法,用于调用我的业务层,该层使用 Linq2SQL 查询从数据库中检索数据。 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查询从数据库中检索数据。我使用 Skip(),Take()和 Orderby()方法。为了让OrderBy接受字符串排序表达式,我使用DynamicLinq没有太多代码,数据绑定,分页和排序自动工作。
答案 2 :(得分:2)
在调用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'
答案 3 :(得分:0)
您可以使用LINQ,只需在所选列上使用OrderBy
,执行以下操作:
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&#39;
<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 图层和存储过程的情况下,它对我有用。