15

我有一个 GridViewObjectDataSource并且我希望能够对其进行排序。

分页工作正常,但是排序给了我一个例外:

GridViewgridView触发了未处理的事件排序。

如何在服务器端启用排序?

(即gridView.EnableSortingAndPagingCallbacks必须保持为假)

4

4 回答 4

20

将 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))
}
于 2009-06-16T18:08:31.320 回答
7

我正在使用 Linq2Sql 和 ObjectDataSource,它可以很好地进行分页和排序。

我实现了一个用作 ObjectDataSource 的类。它有一个 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代码不多,数据绑定、分页和排序都会自动工作。

于 2010-06-11T10:43:16.147 回答
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'
于 2012-06-19T11:06:07.757 回答
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”

<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层和存储过程。

于 2014-12-04T15:52:54.033 回答