您的位置:首页 > 其它

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

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: