废话不说,直接上例子:
前台代码:
<asp:GridView ID="GridView1" runat="server" AllowSorting="true"
AutoGenerateColumns="false" onsorting="GridView1_Sorting">
<Columns>
<asp:BoundField HeaderText="Column1" DataField="Field1" SortExpression="Field1" />
<asp:BoundField HeaderText="Column2" DataField="Field2" SortExpression="Field2" />
</Columns>
</asp:GridView>
注意:
1、需要设置AllowSorting=true
2、需要设置每一列的SortExpression,设置的值为绑定数数据源中的一列,排序时,根据该设置值为排序依据
3、增加onsorting事件
后台代码:
1、本例子使用到的测试类
[Serializable]
public class TestClass
{
public int Field1 { get; set; }
public int Field2 { get; set; }
}
2、为测试例子准备测试数据
protected void Page_Load(object sender, EventArgs e)
{
List<TestClass> oData = new List<TestClass>();
for (int i = ; i <= ; i++)
{
TestClass t = new TestClass() { Field1 = i, Field2 = - i };
oData.Add(t);
}
ViewState["Data"] = oData;
this.GridView1.DataSource = oData;
this.GridView1.DataBind();
}
3、编辑排序事件
protected void GridView1_Sorting(object sender, GridViewSortEventArgs e)
{
//从ViewState取得绑定在界面的数据源
List<TestClass> oDatas = (List<TestClass>)ViewState["Data"]; //从Session取得当前字段的排序状态
if (Session[e.SortExpression] == null)
{
Session[e.SortExpression] = SortDirection.Ascending;
} //判断当前,如果为升序,则以倒序排序一次,如果为倒序,则以升序排序一次,并更新当前排序
//动态的重点在于利用反射,根据e.SortExpression取得排序栏位
if ((SortDirection)Session[e.SortExpression] == SortDirection.Ascending)
{
oDatas = oDatas.OrderBy(c => c.GetType().GetProperty(e.SortExpression).GetValue(c, null)).ToList();
Session[e.SortExpression] = SortDirection.Descending;
}
else
{
oDatas = oDatas.OrderByDescending(c => c.GetType().GetProperty(e.SortExpression).GetValue(c, null)).ToList();
Session[e.SortExpression] = SortDirection.Ascending;
} //重新绑定一次排序後的数据以显示结果
GridView gv = sender as GridView;
gv.DataSource = oDatas;
gv.DataBind();
}
至此,本例子已完。
希望对各位有所帮助。