【问题标题】:Making GridView sortable when manually asigning DataSource手动分配 DataSource 时使 GridView 可排序
【发布时间】:2014-10-10 12:08:27
【问题描述】:

我有一个可以排序的网格视图。当我这样定义它时:

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

排序工作得很好。 IE。当我单击列标题时,网格按该列排序。

但是当我这样定义它时:

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

在代码隐藏中:

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

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

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

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

【问题讨论】:

标签: c# asp.net gridview


【解决方案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 中的数据绑定

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

【讨论】:

  • 我试过了,但是当我点击排序网格时数据源函数没有被调用——所以“sortExpression”没有做任何事情。我确信你所说的一切都是正确的,但我肯定遗漏了一些东西。
  • 你能用你的选择方法和你的对象数据源声明更新问题
  • 我一直在大量整理代码,因此现在可以使用您的解决方案。
  • 我有一个名为“GridDataSource”的数据源,稍微回溯后,我意识到我已将一行从GridView1.DataSource = GridDataSource; 更改为GridView1.DataSourceID = "GridDataSource";,这似乎完全不同。
  • 是的,可以!设置DataSourceID 告诉GridView 使用特定控件。将DataSource 设置为“GridDataSource”会将您的 GridView 绑定到一个字符串。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-23
  • 2012-03-14
相关资源
最近更新 更多