我有一个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,因此用户可以从一些过滤器(下拉列表)中进行选择以限制返回的记录。
有人能告诉我如何在代码隐藏中设置数据源并获得排序功能吗?或者,这是在初始页面加载时阻止网格数据绑定的好方法。
答案 0 :(得分:1)
要对asp.net gridview进行自动排序,您需要做一些事情。
首先,您必须在gridview标记上设置AllowSorting="True"
。
其次,您需要正确配置Fields
。由于您有AutoGenerateColumns=false
,因此您需要手动指定SortExpression:
<asp:BoundFiled DataFiled="Name" HeaderText="Name" SortExpression="Name" />
第三,您需要确保您的数据源支持排序。如果数据直接绑定到DataSet,您应该获得开箱即用的支持。但是,如果您绑定到objectdatasource或sqldatasource,则需要确保SelectMethod
支持排序。
例如,对于objectdatasource,您需要设置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)
语句。