GridView绑定自定义数据源(list)排序问题
2009-08-05 12:08
363 查看
问题:将list数据源绑定到GridView后,排序没有效果。e.SortDirection始终是SortDirection.Ascending。
将list数据源以Gridview1.DataSource的方式绑定到GridView1Code
default2.aspx的代码
Code
1 using System;
2 using System.Data;
3 using System.Configuration;
4 using System.Collections;
5 using System.Web;
6 using System.Web.Security;
7 using System.Web.UI;
8 using System.Web.UI.WebControls;
9 using System.Web.UI.WebControls.WebParts;
10 using System.Web.UI.HtmlControls;
11 using System.Web.UI.MobileControls;
12 using System.Collections.Generic;
13 using myWebUserControl;
14 using System.Reflection;
15
16
17 [Serializable]
18 public class mySize
19 {
20 private int _Size = 0;
21
22 public int Size
23 {
24 get { return _Size; }
25 set { _Size = value; }
26 }
27
28
29 public mySize(int size)
30 {
31 Size=size;
32 }
33 }
34
35 [Serializable]
36 public class myFile
37 {
38 private DateTime _FileName ;
39
40 public DateTime FileName
41 {
42 get { return _FileName; }
43 set { _FileName = value; }
44 }
45 private mySize _mySize = null;
46
47 public mySize mySize
48 {
49 get { return _mySize; }
50 set { _mySize = value; }
51 }
52 public myFile(DateTime filename,int size)
53 {
54 FileName = filename;
55 mySize = new mySize(size);
56 }
57 }
58
59 public partial class Default2 : System.Web.UI.Page
60 {
61
62 DateTime date = DateTime.Now;
63 BindListGridViewSortUtil bindListUtil = null;
64 protected void Page_Load(object sender, EventArgs e)
65 {
66
67 if (!IsPostBack||ViewState["bindUtil"]==null)
68 {
69
70 List<myFile> filelist = new List<myFile>();
71 for (int i = 0; i < 250; i++)
72 {
73 date = date.AddDays(1);
74 filelist.Add(new myFile(date, i));
75 }
76
77 GridView1.AllowPaging = true;
78 GridView1.AllowSorting = true;
79
80 bindListUtil = new BindListGridViewSortUtil();
81 bindListUtil.Result = filelist;
82 ViewState["bindUtil"] = bindListUtil;
83 }
84
85
86 if (ViewState["bindUtil"] != null)
87 {
88 bindListUtil = (BindListGridViewSortUtil)ViewState["bindUtil"];
89 }
90 bindListUtil.BindListToGridView<myFile>(GridView1, null);
91 GridView1.DataBind();
92 }
93
94 }
95
96 [Serializable]
97 public class BindListGridViewSortUtil
98 {
99
#region Filed
private object _Result = new object();
/// <summary>
/// 排序后的结果集
/// </summary>
public object Result
{
get { return _Result; }
set { _Result = value; }
}
private bool _AutoFill = true;
/// <summary>
/// 自动填充模式,即如果内部结果集Result有值,则优先使用内部结果集进行填充。
/// </summary>
public bool AutoFill
{
get { return _AutoFill; }
set { _AutoFill = value; }
}
private string _SortExpression = "";
/// <summary>
/// 要进行排序的!属性!名称
/// </summary>
public string SortExpression
{
get { return _SortExpression; }
}
private System.Web.UI.WebControls.SortDirection _mySortDirection = System.Web.UI.WebControls.SortDirection.Ascending;
/// <summary>
/// GridView的排序方式,递增,递减
/// </summary>
public System.Web.UI.WebControls.SortDirection mySortDirection
{
get { return _mySortDirection; }
//set { _mySortDirection = value; }
}
#endregion
#region Methods
/// <summary>
/// GridView的分页响应事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
public void BindListGridView1_PageIndexChanging(object sender, System.Web.UI.WebControls.GridViewPageEventArgs e)
{
System.Web.UI.WebControls.GridView bindListGridView = sender as System.Web.UI.WebControls.GridView;
if (sender == null)
{
return;
}
bindListGridView.PageIndex = e.NewPageIndex;
bindListGridView.DataBind();
}
/// <summary>
/// GridView的排序响应时间
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="sender"></param>
/// <param name="e"></param>
public void BindListGridView1_Sorting<T>(object sender, System.Web.UI.WebControls.GridViewSortEventArgs e)
{
System.Web.UI.WebControls.GridView bindListGridView = sender as System.Web.UI.WebControls.GridView;
if (sender == null)
{
return;
}
_SortExpression = e.SortExpression;
List<T> sortResult=new List<T>();
sortResult = ListSort<T>(bindListGridView.DataSource as List<T>); //对DataSource进行升序排序
if (mySortDirection == System.Web.UI.WebControls.SortDirection.Ascending)
{
_mySortDirection = System.Web.UI.WebControls.SortDirection.Descending;
}
else
{
sortResult.Reverse(); //如果需要降序排序,则将结果倒转一次。
_mySortDirection = System.Web.UI.WebControls.SortDirection.Ascending;
}
Result = sortResult;
bindListGridView.DataSource = sortResult;
bindListGridView.DataBind();
}
/// <summary>
/// 对List按照特定属性进行排序
/// </summary>
/// <typeparam name="T">List<T>中存储的变量类型</typeparam>
/// <param name="list"></param>
/// <returns></returns>
public System.Collections.Generic.List<T> ListSort<T>(System.Collections.Generic.List<T> list)
{
if (list == null)
{
return null;
}
list.Sort(new Comparison<T>(CompareBigThan<T>));
return list;
}
/// <summary>
/// 对两个特定类型的变量按照其中某个属性的大小进行排序
/// </summary>
/// <typeparam name="T">该变量的类型</typeparam>
/// <param name="objA">比较值一</param>
/// <param name="objB">比较值二</param>
/// <returns>结果</returns>
public int myCompare<T>(T objA, T objB)
{
if (objA == null || objB == null)
{
return 0; //任意一个比较值为null就返回0值。
}
System.Type t = objA.GetType();
System.Reflection.PropertyInfo p = t.GetProperty(SortExpression);
if (p != null)
{
object objA_Comparevalue = p.GetValue(objA, null);
object objB_Comparevalue = p.GetValue(objB, null);
//
//判断该属性的类型,并按该类型的比较方式进行比较
//
//
if (objA_Comparevalue.GetType() == typeof(DateTime))
{
return DateTime.Compare((DateTime)objA_Comparevalue, (DateTime)objB_Comparevalue);
}
if (objA_Comparevalue.GetType() == typeof(int))
{
return (int)objA_Comparevalue - (int)objB_Comparevalue;
}
if (objA_Comparevalue.GetType() == typeof(string))
{
return string.Compare(objA_Comparevalue.ToString(), objB_Comparevalue.ToString());
}
if (objA_Comparevalue.GetType() == typeof(long))
{
return (int)((long)objA_Comparevalue - (long)objB_Comparevalue);
}
if (objA_Comparevalue.GetType() == typeof(double))
{
return (int)((double)objA_Comparevalue - (double)objB_Comparevalue);
}
return 0;
}
return 0;
//
//比较值的类型中没有该属性,以及不在能进行比较范围内的类型返回值为0。
//
}
public int CompareBigThan<T>(T objA, T objB)
{
return myCompare<T>(objB, objA);
}
/// <summary>
/// 将数据源绑定到GridView
/// </summary>
/// <typeparam name="T">数据源对象的类型</typeparam>
/// <param name="gridViewToBind">GridView对象</param>
/// <param name="dataSource">绑定到GridView的数据源。当AutoFile为false时或Result结果集无值时使用该值。</param>
public void BindListToGridView<T>(System.Web.UI.WebControls.GridView gridViewToBind, List<T> dataSource)
{
gridViewToBind.PageIndexChanging += new GridViewPageEventHandler(this.BindListGridView1_PageIndexChanging);
gridViewToBind.Sorting += new GridViewSortEventHandler(this.BindListGridView1_Sorting<T>);
List<T> data = this.Result as List<T>;
if (AutoFill&&data!=null)
{
gridViewToBind.DataSource = (List<T>)this.Result;
}
else
{
gridViewToBind.DataSource=dataSource;
}
}
#endregion
}
将list数据源以Gridview1.DataSource的方式绑定到GridView1Code
default2.aspx的代码
Code
1 using System;
2 using System.Data;
3 using System.Configuration;
4 using System.Collections;
5 using System.Web;
6 using System.Web.Security;
7 using System.Web.UI;
8 using System.Web.UI.WebControls;
9 using System.Web.UI.WebControls.WebParts;
10 using System.Web.UI.HtmlControls;
11 using System.Web.UI.MobileControls;
12 using System.Collections.Generic;
13 using myWebUserControl;
14 using System.Reflection;
15
16
17 [Serializable]
18 public class mySize
19 {
20 private int _Size = 0;
21
22 public int Size
23 {
24 get { return _Size; }
25 set { _Size = value; }
26 }
27
28
29 public mySize(int size)
30 {
31 Size=size;
32 }
33 }
34
35 [Serializable]
36 public class myFile
37 {
38 private DateTime _FileName ;
39
40 public DateTime FileName
41 {
42 get { return _FileName; }
43 set { _FileName = value; }
44 }
45 private mySize _mySize = null;
46
47 public mySize mySize
48 {
49 get { return _mySize; }
50 set { _mySize = value; }
51 }
52 public myFile(DateTime filename,int size)
53 {
54 FileName = filename;
55 mySize = new mySize(size);
56 }
57 }
58
59 public partial class Default2 : System.Web.UI.Page
60 {
61
62 DateTime date = DateTime.Now;
63 BindListGridViewSortUtil bindListUtil = null;
64 protected void Page_Load(object sender, EventArgs e)
65 {
66
67 if (!IsPostBack||ViewState["bindUtil"]==null)
68 {
69
70 List<myFile> filelist = new List<myFile>();
71 for (int i = 0; i < 250; i++)
72 {
73 date = date.AddDays(1);
74 filelist.Add(new myFile(date, i));
75 }
76
77 GridView1.AllowPaging = true;
78 GridView1.AllowSorting = true;
79
80 bindListUtil = new BindListGridViewSortUtil();
81 bindListUtil.Result = filelist;
82 ViewState["bindUtil"] = bindListUtil;
83 }
84
85
86 if (ViewState["bindUtil"] != null)
87 {
88 bindListUtil = (BindListGridViewSortUtil)ViewState["bindUtil"];
89 }
90 bindListUtil.BindListToGridView<myFile>(GridView1, null);
91 GridView1.DataBind();
92 }
93
94 }
95
96 [Serializable]
97 public class BindListGridViewSortUtil
98 {
99
#region Filed
private object _Result = new object();
/// <summary>
/// 排序后的结果集
/// </summary>
public object Result
{
get { return _Result; }
set { _Result = value; }
}
private bool _AutoFill = true;
/// <summary>
/// 自动填充模式,即如果内部结果集Result有值,则优先使用内部结果集进行填充。
/// </summary>
public bool AutoFill
{
get { return _AutoFill; }
set { _AutoFill = value; }
}
private string _SortExpression = "";
/// <summary>
/// 要进行排序的!属性!名称
/// </summary>
public string SortExpression
{
get { return _SortExpression; }
}
private System.Web.UI.WebControls.SortDirection _mySortDirection = System.Web.UI.WebControls.SortDirection.Ascending;
/// <summary>
/// GridView的排序方式,递增,递减
/// </summary>
public System.Web.UI.WebControls.SortDirection mySortDirection
{
get { return _mySortDirection; }
//set { _mySortDirection = value; }
}
#endregion
#region Methods
/// <summary>
/// GridView的分页响应事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
public void BindListGridView1_PageIndexChanging(object sender, System.Web.UI.WebControls.GridViewPageEventArgs e)
{
System.Web.UI.WebControls.GridView bindListGridView = sender as System.Web.UI.WebControls.GridView;
if (sender == null)
{
return;
}
bindListGridView.PageIndex = e.NewPageIndex;
bindListGridView.DataBind();
}
/// <summary>
/// GridView的排序响应时间
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="sender"></param>
/// <param name="e"></param>
public void BindListGridView1_Sorting<T>(object sender, System.Web.UI.WebControls.GridViewSortEventArgs e)
{
System.Web.UI.WebControls.GridView bindListGridView = sender as System.Web.UI.WebControls.GridView;
if (sender == null)
{
return;
}
_SortExpression = e.SortExpression;
List<T> sortResult=new List<T>();
sortResult = ListSort<T>(bindListGridView.DataSource as List<T>); //对DataSource进行升序排序
if (mySortDirection == System.Web.UI.WebControls.SortDirection.Ascending)
{
_mySortDirection = System.Web.UI.WebControls.SortDirection.Descending;
}
else
{
sortResult.Reverse(); //如果需要降序排序,则将结果倒转一次。
_mySortDirection = System.Web.UI.WebControls.SortDirection.Ascending;
}
Result = sortResult;
bindListGridView.DataSource = sortResult;
bindListGridView.DataBind();
}
/// <summary>
/// 对List按照特定属性进行排序
/// </summary>
/// <typeparam name="T">List<T>中存储的变量类型</typeparam>
/// <param name="list"></param>
/// <returns></returns>
public System.Collections.Generic.List<T> ListSort<T>(System.Collections.Generic.List<T> list)
{
if (list == null)
{
return null;
}
list.Sort(new Comparison<T>(CompareBigThan<T>));
return list;
}
/// <summary>
/// 对两个特定类型的变量按照其中某个属性的大小进行排序
/// </summary>
/// <typeparam name="T">该变量的类型</typeparam>
/// <param name="objA">比较值一</param>
/// <param name="objB">比较值二</param>
/// <returns>结果</returns>
public int myCompare<T>(T objA, T objB)
{
if (objA == null || objB == null)
{
return 0; //任意一个比较值为null就返回0值。
}
System.Type t = objA.GetType();
System.Reflection.PropertyInfo p = t.GetProperty(SortExpression);
if (p != null)
{
object objA_Comparevalue = p.GetValue(objA, null);
object objB_Comparevalue = p.GetValue(objB, null);
//
//判断该属性的类型,并按该类型的比较方式进行比较
//
//
if (objA_Comparevalue.GetType() == typeof(DateTime))
{
return DateTime.Compare((DateTime)objA_Comparevalue, (DateTime)objB_Comparevalue);
}
if (objA_Comparevalue.GetType() == typeof(int))
{
return (int)objA_Comparevalue - (int)objB_Comparevalue;
}
if (objA_Comparevalue.GetType() == typeof(string))
{
return string.Compare(objA_Comparevalue.ToString(), objB_Comparevalue.ToString());
}
if (objA_Comparevalue.GetType() == typeof(long))
{
return (int)((long)objA_Comparevalue - (long)objB_Comparevalue);
}
if (objA_Comparevalue.GetType() == typeof(double))
{
return (int)((double)objA_Comparevalue - (double)objB_Comparevalue);
}
return 0;
}
return 0;
//
//比较值的类型中没有该属性,以及不在能进行比较范围内的类型返回值为0。
//
}
public int CompareBigThan<T>(T objA, T objB)
{
return myCompare<T>(objB, objA);
}
/// <summary>
/// 将数据源绑定到GridView
/// </summary>
/// <typeparam name="T">数据源对象的类型</typeparam>
/// <param name="gridViewToBind">GridView对象</param>
/// <param name="dataSource">绑定到GridView的数据源。当AutoFile为false时或Result结果集无值时使用该值。</param>
public void BindListToGridView<T>(System.Web.UI.WebControls.GridView gridViewToBind, List<T> dataSource)
{
gridViewToBind.PageIndexChanging += new GridViewPageEventHandler(this.BindListGridView1_PageIndexChanging);
gridViewToBind.Sorting += new GridViewSortEventHandler(this.BindListGridView1_Sorting<T>);
List<T> data = this.Result as List<T>;
if (AutoFill&&data!=null)
{
gridViewToBind.DataSource = (List<T>)this.Result;
}
else
{
gridViewToBind.DataSource=dataSource;
}
}
#endregion
}
相关文章推荐
- GridView绑定数据源List列排序
- 面向对象的设计方式处理Android编程中的GridView问题,以及自定义ListAdapter的使用
- 扩展GridView实现的一个自定义无刷新分页,排序,支持多种数据源的控件TwfGridView
- 【原创】使用GridView实现绑定List并排序
- Bug?用 DataSource 属性绑定的 GridView 的排序问题
- 复杂自定义数据对象绑定到GridView的问题
- gridview自定义绑定字段实现排序功能
- DataRow[]、List<DataRow>无法绑定到GridView的问题解决!
- 关于List<Model>类型 GridView排序问题的解决
- 当list做gridview的数据源时,可以用泛型来对list进行排序
- List作为GridView数据源时,绑定模板列的例子
- 面向对象的设计方式处理Android编程中的GridView问题,以及自定义ListAdapter的使用
- ArrayList绑定GridView排序问题
- GridView绑定手工数据源的数据操作(编辑,删除,排序)
- DataGridView 绑定List 时 排序问题的解决
- 面向对象的设计方式处理Android编程中的GridView问题,以及自定义ListAdapter的使用
- 每日学习总结:DataTable按某一列数值大小排序问题、GridView后台动态绑定、页面导航方法总结
- DataGridView绑定List<T>数据源时,点击DataGridView列头自动排序解决方法
- 解决DataGridView绑定List后不能排序的问题
- VS2005 GridView动态绑定数据源(交叉表) 动态绑定列 动态生成模板列 自定义表头