手动分配DataSource时使GridView可排序

时间:2014-10-10 12:08:28

标签: c# asp.net gridview

我有一个gridview,我想要排序。当我这样定义时:

<asp:GridView ID="GridView1" runat="server" CssClass="gridview" DataSourceID="GridDataSource" AutoGenerateColumns="False" AllowSorting="True" >

排序工作正常。即。当我单击列标题时,网格按该列排序。

但是当我这样定义时:

<asp:GridView ID="GridView1" runat="server" CssClass="gridview"  AutoGenerateColumns="False" AllowSorting="True" >

和代码隐藏:

GridView1.DataSource = GridDataSource;
GridView1.DataBind();

使用后一种方法,排序不起作用。列标题是链接,但网格没有自行排序。

我在页面加载后设置了DataSource,因此用户可以从一些过滤器(下拉列表)中进行选择以限制返回的记录。

有人能告诉我如何在代码隐藏中设置数据源并获得排序功能吗?或者,这是在初始页面加载时阻止网格数据绑定的好方法。

1 个答案:

答案 0 :(得分:1)

要对 进行自动排序,您需要做一些事情。

首先,您必须在gridview标记上设置AllowSorting="True"

其次,您需要正确配置Fields。由于您有AutoGenerateColumns=false,因此您需要手动指定SortExpression

<asp:BoundFiled DataFiled="Name" HeaderText="Name" SortExpression="Name" />

第三,您需要确保您的数据源支持排序。如果数据直接绑定到DataSet,您应该获得开箱即用的支持。但是,如果您绑定到,则需要确保SelectMethod支持排序。

例如,对于,您需要设置SortParameterName,然后确保SelectParameters集合中存在相同的参数:

 <asp:ObjectDataSource ID="GridDataSource" runat="server"
    SelectMethod="ExampleSelect"
    TypeName="SO"        
    SortParameterName="sortExpression">       
    <SelectParameters>
        <asp:Parameter Name="sortExpression" Type="String" />
    </SelectParameters>
 </asp:ObjectDataSource>

然后SelectMethod将负责实施排序:

 namesapce SO{
     public class ExampleSelect{
         public object[] ExampleSelect(string sortExpression)
         {
            var allItems = GetAllItems();

            bool sortDesc = 
                 //if sort descending, sortExpression will be suffixed with " DESC"
                 (sortExpression.Split(' ').Count() > 1);

            if (sortExpression.StartsWith("Name"))
            {
                if (sortDesc)
                    return allItems.OrderByDescending(x => x.Name);
                else
                    return allItems.OrderBy(x => x.Name);
            }
            else
            {
               return allItems;
            }
         }
     }
 }

<强>提示

在code_behind中进行数据绑定

我建议使用其中一个数据源控件以标记方式声明数据绑定。它消除了后面代码中的misc代码,让框架处理何时进行数据绑定,这样你就不必破坏if (!IsPostBack)语句。