2014-10-10 17 views
1

我有一个我希望可排序的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(); 

采用后一种方法排序不起作用。列标题是链接,但网格不自己排序。

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

有人能告诉我如何在代码隐藏中设置数据源并获得排序功能吗?另外一个好方法可以阻止网格在初始页面加载时进行数据绑定。

+2

你可能会在[这个SO帖子]中找到你的答案(http://stackoverflow.com/questions/5388245/gridview-sorting-works-once-only) – Michael 2014-10-10 12:22:54

回答

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; 
      } 
     } 
    } 
} 

提示

数据绑定in code_behind

我推荐使用数据源控件之一在标记中声明数据绑定。它在代码背后摆脱了misc代码,并让框架处理数据绑定的时间,因此您不必破坏if (!IsPostBack)语句。

+0

我试过这个,但是数据源函数并没有被调用,当我点击命令网格 - 所以“sortExpression”不做任何事情。我相信你所说的一切都是正确的,但我肯定错过了一些东西。 – 2014-10-10 16:36:52

+0

您是否可以使用您的选择方法和对象数据源声明来更新问题 – 2014-10-10 16:38:06

+0

我一直在大量地整理代码,因此现在可以使用您的解决方案。 – 2014-10-13 11:11:58