最近做一个项目需要点击列名进行排序功能,并且要在分页后还能排序。自己琢磨这就写了一个,废话不多说贴出效果图
如图可以点击列名进行排序,点击第一下为升序第二下则为降序
说下实现思路
1 gridview自带的有排序功能,但如果是自己绑定数据源的话就不怎么好用了所以我们要自己写上排序事件
<asp:GridView ID="GvList" runat="server" AutoGenerateColumns="False"
onrowdatabound="GvList_RowDataBound" Width="100%" AllowSorting="True"
onsorting="GvList_Sorting">
以上为前台代码都能看懂吧,其中AllowSorting属性是我们要打开排序功能
onsorting这个事件就是我们要实现的了,在点击列头的时候会触发,下面贴出onsorting事件的代码
//排序
protected void GvList_Sorting(object sender, GridViewSortEventArgs e)
{
//得到分页数据源
List<Tbl_languageStudent> lts = ViewState["dataSource"] as List<Tbl_languageStudent>;
//如果当前是升序排列则改成降序
if (ViewState["sort"].ToString() == "asc")
{
lts = lts.OrderByDescending(p => Operate.GetPropertyValue(p, e.SortExpression)).ToList();
ViewState["sort"] = "desc";
}
else //如果当前是降序排列则改成升序
{
lts = lts.OrderBy(p => Operate.GetPropertyValue(p, e.SortExpression)).ToList();
ViewState["sort"] = "asc";
}
BindView(lts);
}
这个方法一看是不是很简单,首先我们要得到一个数据源
e.SortExpression这样可以得到我们点击的那一列绑定的字段名称
下面我们会根据字段名称进行排序
使用linq来排序是不是要方便很多,但是linq里面我们要怎么将我们得到的字段的名称转换成元数据属性来排序呢?
直接用得到的字符串是不行的,所以这里我们用了一个方法GetPropertyValue(object obj, string property)
我们需要通过GetPropertValue这个方法来将我们的字符串转换成属性,这样才能在linq中使用,方法贴上
/// <summary>
/// 根据属性的字符串形式找到属性的元数据信息
/// </summary>
/// <param name="obj">类名称</param>
/// <param name="property">列名</param>
/// <returns></returns>
public static object GetPropertyValue(object obj, string property)
{
System.Reflection.PropertyInfo propertyInfo = obj.GetType().GetProperty(property);
return propertyInfo.GetValue(obj, null);
}
这个方法我们用个到了反射,通过反射将字段的名称的字符串得到元数据属性信息
到了这里是不是已经就完成了,升序和降序的体现代码中已经很清楚了主要是已ViewState["sort"]这个来存储状态来判断的,
当然这个可能会不是明确,不能明确点击列名时是升序还是降序,只用通过上一列的升降序状态来体现,但这都不要紧,我们体现的就是一个
排序的功能。
最后一点
if (!IsPostBack)
{
this.BindView(Tbl_languageStudentManager.GetAllTbl_languageStudents().ToList());
ViewState["dataSource"] = Tbl_languageStudentManager.GetAllTbl_languageStudents();
ViewState["sort"] = "asc";//默认为升序排列
}
这里我在页面首次加载是默认了其为升序排列,当然这个不是主要的,你也可以写成降序,也可以不写或者用你们更好的方法
来体现出升序和降序。
说明:此排序方法我自己原创,今后我回将自己所学到的东西通过博客园这个平台来记录,如果你们发现了什么问题或者有什么
更好的方式来体现请指出,大家一起探讨。