首先看最终的代码(实现排序,翻页,设置排序图标):
// 翻页
private void dgdList_PageIndexChanged(object source, System.Web.UI.WebControls.DataGridPageChangedEventArgs e)

{
this.dgCommon.PageChange(dgdList, e);
}

// 排序
private void dgdList_SortCommand(object source, System.Web.UI.WebControls.DataGridSortCommandEventArgs e)

{
this.dgCommon.SortDataGrid(dgdList, e);
}

// 设置排序图标
private void dgdList_ItemCreated(object sender, System.Web.UI.WebControls.DataGridItemEventArgs e)

{
this.dgCommon.SetItemCreated(dgdList, e);
}

接下来看如何实现:
DataGrid公用操作类,提供排序,翻页,添加数据源,设置排序图标等功能。
using System;
using System.Collections;
using System.Data;
using System.Web;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
using System.Web.UI;

namespace NameSpace


{

/**//// <summary>
/// 控件DataGrid的通用类。
/// </summary>
/// <remarks>该类中包括对DataGrid的排序,添加数据源等方法。
/// <author>天志</author>
/// <log date="2006-05-24">创建</log>
/// </remarks>
public class DataGridCommon

{

声明委托#region 声明委托


/**//// <summary>
/// 给DataGrid添加数据源。
/// </summary>
/// <remarks>
/// <author>天志</author>
/// <log date="2006-05-24">创建</log>
/// </remarks>
public delegate void
SetDataGridSourceHandler(DataGrid dgdList, bool refresh,string sortExpression);


/**//// <summary>
/// 给DataGrid排序。
/// </summary>
/// <remarks>
/// <author>天志</author>
/// <log date="2006-05-24">创建</log>
/// </remarks>
public delegate void
SetDataGridSortHandler(DataGrid dgdList, DataGridSortCommandEventArgs e);


/**//// <summary>
/// 取得排序字段。
/// </summary>
/// <remarks>
/// <author>天志</author>
/// <log date="2006-05-24">创建</log>
/// </remarks>
public delegate void
SetDataGridItemCreateHandler(DataGrid dgdList, DataGridItemEventArgs e);
#endregion


声明事件#region 声明事件


/**//// <summary>
/// 给DataGrid添加数据源。
/// </summary>
/// <remarks>
/// <author>天志</author>
/// <log date="2006-05-24">创建</log>
/// </remarks>
private event SetDataGridSourceHandler bindDataGrid;


/**//// <summary>
/// 给DataGrid排序。
/// </summary>
/// <remarks>
/// <author>天志</author>
/// <log date="2006-05-24">创建</log>
/// </remarks>
private event SetDataGridSortHandler sortDataGrid;


/**//// <summary>
/// 取得排序字段。
/// </summary>
/// <remarks>
/// <author>天志</author>
/// <log date="2006-05-24">创建</log>
/// </remarks>
private event SetDataGridItemCreateHandler itemCreateDataGrid;
#endregion


/**//// <summary>
/// 构造函数。
/// </summary>
/// <param name="viewStateBag">ViewState</param>
/// <example>案例代码:
/// <code>
/// DataGridCommon dataGridCommon = new DataGridCommon(ViewState);
/// </code>
/// </example>
/// <remarks>
/// <author>天志</author>
/// <log date="2006-05-24">创建</log>
/// </remarks>
public DataGridCommon(SetDataGridSourceHandler onBindEvent, SetDataGridSortHandler sortEvent, SetDataGridItemCreateHandler onItemCreateEvent)

{
bindDataGrid = onBindEvent;
sortDataGrid = sortEvent;
itemCreateDataGrid = onItemCreateEvent;
}


添加DataGrid的数据源#region 添加DataGrid的数据源


/**//// <summary>
/// 添加DataGrid的数据源。
/// </summary>
/// <param name="dgdList"></param>
/// <param name="refresh"></param>
/// <param name="sortExpression"></param>
public void BindDataGrid(DataGrid dgdList, bool refresh,string sortExpression)

{
if (bindDataGrid != null)

{
bindDataGrid(dgdList, refresh, sortExpression);
}
}


/**//// <summary>
/// 添加DataGrid的数据源。
/// </summary>
/// <param name="dgdList"></param>
/// <param name="sortExpression"></param>
public void BindDataGrid(DataGrid dgdList, string sortExpression)

{
BindDataGrid(dgdList, false, sortExpression);
}


/**//// <summary>
/// 添加DataGrid的数据源。
/// </summary>
/// <param name="dgdList"></param>
/// <param name="refresh"></param>
public void BindDataGrid(DataGrid dgdList, bool refresh)

{
BindDataGrid(dgdList, refresh, null);
}


/**//// <summary>
/// 添加DataGrid的数据源。
/// </summary>
/// <param name="dgdList"></param>
public void BindDataGrid(DataGrid dgdList)

{
BindDataGrid(dgdList, false);
}
#endregion


/**//// <summary>
/// 取得排序字段。
/// </summary>
/// <param name="e"></param>
public void SetItemCreated(DataGrid dgdList, DataGridItemEventArgs e)

{
if (itemCreateDataGrid != null)

{
itemCreateDataGrid(dgdList, e);
}
}



/**//// <summary>
/// 排序。
/// </summary>
/// <param name="dgdList"></param>
/// <param name="e"></param>
public void SortDataGrid(DataGrid dgdList, DataGridSortCommandEventArgs e)

{
if (sortDataGrid != null)

{
sortDataGrid(dgdList, e);
}
}


/**//// <summary>
/// 分页。
/// </summary>
/// <param name="dgdList"></param>
/// <param name="e"></param>
public void PageChange(DataGrid dgdList, DataGridPageChangedEventArgs e)

{
dgdList.EditItemIndex = -1;
dgdList.SelectedIndex = -1;
dgdList.CurrentPageIndex = e.NewPageIndex;
BindDataGrid(dgdList);
}


/**//// <summary>
/// 取消编辑。
/// </summary>
/// <param name="dgdList"></param>
/// <param name="e"></param>
public void EditCancel(DataGrid dgdList, DataGridCommandEventArgs e)

{
dgdList.EditItemIndex = -1;
BindDataGrid(dgdList);
}


/**//// <summary>
/// 编辑。
/// </summary>
/// <param name="dgdList"></param>
/// <param name="e"></param>
public void EditDataGrid(DataGrid dgdList, DataGridCommandEventArgs e)

{
dgdList.EditItemIndex = e.Item.ItemIndex;
dgdList.SelectedIndex = -1;
BindDataGrid(dgdList);
}


取得相关值域的TableCell#region 取得相关值域的TableCell


/**//// <summary>
/// 取得相关值域的索引。
/// </summary>
/// <param name="dgdList"></param>
/// <param name="dataField"></param>
/// <returns></returns>
public int GetDataFieldIndex(DataGrid dgdList, string dataField)

{
int columns = dgdList.Columns.Count;
for (int i = 0; i < columns; i++)

{
if (dgdList.Columns[i].GetType() != typeof(BoundColumn))

{
continue;
}

string field = ((BoundColumn)dgdList.Columns[i]).DataField;
if (field.Trim().ToLower() == dataField.Trim().ToLower())

{
return i;
}
}

return -1;
}


/**//// <summary>
/// 取得相关值域的TableCell。
/// </summary>
/// <param name="dgdList"></param>
/// <param name="e"></param>
/// <param name="dataField"></param>
/// <returns></returns>
public TableCell GetDataFieldCell(DataGrid dgdList, DataGridItemEventArgs e, string dataField)

{
int index = GetDataFieldIndex(dgdList, dataField);

if (index == -1)

{
return null;
}

return (TableCell)e.Item.Cells[index];
}
#endregion


取得相关值域的HyperLink#region 取得相关值域的HyperLink


/**//// <summary>
/// 取得相关值域的索引(HyperLink)。
/// </summary>
/// <param name="dgdList"></param>
/// <param name="dataField"></param>
/// <returns></returns>
public int GetHyperLinkIndex(DataGrid dgdList, string dataField)

{
int columns = dgdList.Columns.Count;
for (int i = 0; i < columns; i++)

{
if (dgdList.Columns[i].GetType() != typeof(HyperLinkColumn))

{
continue;
}

string field = ((HyperLinkColumn)dgdList.Columns[i]).DataTextField;
if (field.Trim().ToLower() == dataField.Trim().ToLower())

{
return i;
}
}

return -1;
}


/**//// <summary>
/// 取得相关值域的HyperLink。
/// </summary>
/// <param name="dgdList"></param>
/// <param name="e"></param>
/// <param name="dataField"></param>
/// <returns></returns>
public HyperLink GetDataFieldHyperLink(DataGrid dgdList, DataGridItemEventArgs e, string dataField)

{
int index = GetHyperLinkIndex(dgdList, dataField);

if (index == -1)

{
return null;
}

return (HyperLink)e.Item.Cells[index].Controls[0];
}
#endregion
}
}


结合页面基类使用:
using System;
using System.Data;
using System.Collections;
using System.Text.RegularExpressions;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;


/**//// <summary>
/// Web表现层类的基类。
/// </summary>
/// <author>天志</author>
/// <log date="2006-05-24">创建</log>
public class BasePage : System.Web.UI.Page

{

/**//// <summary>
/// 处理DataGrid的对象。
/// </summary>
/// <author>天志</author>
/// <log date="2006-05-24">创建</log>
protected DataGridCommon dgCommon = null;

public BasePage() : base()

{
// 注册处理DataGrid对象的方法
dgCommon =
new DataGridCommon
(
new DataGridCommon.SetDataGridSourceHandler(BindDataGrid),
new DataGridCommon.SetDataGridSortHandler(SortDataGrid),
new DataGridCommon.SetDataGridItemCreateHandler(SetItemCreated)
);
}


处理DataGrid的方法#region 处理DataGrid的方法


/**//// <summary>
/// 页面名称。
/// </summary>
public virtual string absoluteUri

{
get

{
return Context.Request.Url.AbsolutePath;
}
}


/**//// <summary>
/// 返回当前的排序方向,该信息是在Page 状态中维持的
/// </summary>
public virtual bool SortAscending

{
get

{
object o = ViewState["SortAscending"];
if (o != null)
return (bool)o;
return true;
}
set

{
ViewState["SortAscending"] = value;
}
}


/**//// <summary>
/// 返回当前的排序字段,该信息是在Page 状态中维持的
/// </summary>
public virtual string SortField

{
get

{
object o = ViewState["SortField"];
if (o != null)
return (string)o;
return "name";
}
set

{
ViewState["SortField"] = value;
}
}


/**//// <summary>
/// 添加DataGrid的数据源。
/// </summary>
/// <param name="dgdList"></param>
/// <param name="refresh"></param>
/// <param name="sortExpression"></param>
private void BindDataGrid(DataGrid dgdList, bool refresh,string sortExpression)

{
DataView dv = null;
if ( refresh == true || Session[absoluteUri] == null)

{
dv = GetData();

if (dgdList.AllowSorting)

{
Session[absoluteUri] = dv;
}
}
else

{
dv = (DataView)Session[absoluteUri];
}

if ( SortAscending == false )

{
if( sortExpression != null)

{
if( sortExpression.Trim() != "")

{
sortExpression = sortExpression + " desc";
}
}
}
if (sortExpression != null)

{
dv.Sort = sortExpression; //****防止分页后排序顺序改变******//

}

dgdList.DataSourc = dv;
dgdList.DataBind();
}


/**//// <summary>
/// 取得DataGrid的数据源。
/// </summary>
/// <returns></returns>
public virtual DataView GetData()

{
throw new Exception("没有重写基类中的“GetData()”函数,所以无法设置DataGrid的数据源。");
}


/**//// <summary>
/// 取得排序字段。
/// </summary>
/// <param name="e"></param>
private void SetItemCreated(DataGrid dgdList, DataGridItemEventArgs e)

{
if (e.Item.ItemType == ListItemType.Header)

{
for (int i = 0; i < dgdList.Columns.Count; i++)

{
bool ascending = SortAscending;
Label sortGlyph = new Label();
sortGlyph.Text = ascending ? " 5" : " 6";
sortGlyph.Font.Name = "Webdings";

TableCell cell = null;

if (SortField == dgdList.Columns[i].SortExpression)

{
cell = e.Item.Cells[i];
}

if (cell != null)

{
cell.Controls.Add(sortGlyph);
return;
}
}
}
}


/**//// <summary>
/// 排序。
/// </summary>
/// <param name="dgdList"></param>
/// <param name="e"></param>
private void SortDataGrid(DataGrid dgdList, DataGridSortCommandEventArgs e)

{
string currentSortField = SortField;

SortField = e.SortExpression;
if (currentSortField.Equals(e.SortExpression))

{
SortAscending = !SortAscending;
}
else

{
SortAscending = true;
}

dgdList.SelectedIndex = -1;
dgdList.EditItemIndex = -1;

BindDataGrid(dgdList, false, e.SortExpression);
}
#endregion
}

页面中的调用:
using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;



/**//// <summary>
/// 订票列表页面。
/// </summary>
/// <author>天志</author>
/// <log date="2006-05-25">创建</log>
public class Ticket_List : BasePage

{
protected DataGrid dgdList;
private void Page_Load(object sender, System.EventArgs e)

{
if (!IsPostBack)

{
this.dgCommon.BindDataGrid(dgdList);
}
}


/**//// <summary>
/// 取得DataGrid的数据源。
/// </summary>
/// <returns></returns>
public override DataView GetData()

{
// 取得数据源数据
return null;
}
}


Web 窗体设计器生成的代码#region Web 窗体设计器生成的代码
override protected void OnInit(EventArgs e)

{
//
// CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。
//
InitializeComponent();
base.OnInit(e);
}

/**//// <summary>
/// 设计器支持所需的方法 - 不要使用代码编辑器修改
/// 此方法的内容。
/// </summary>
private void InitializeComponent()

{
this.dgdList.ItemCreated += new System.Web.UI.WebControls.DataGridItemEventHandler(this.dgdList_ItemCreated);
this.dgdList.SortCommand += new System.Web.UI.WebControls.DataGridSortCommandEventHandler(this.dgdList_SortCommand);
this.dgdList.PageIndexChanged += new System.Web.UI.WebControls.DataGridPageChangedEventHandler(this.dgdList_PageIndexChanged);
this.Load += new System.EventHandler(this.Page_Load);

}
#endregion

// 翻页
private void dgdList_PageIndexChanged(object source, System.Web.UI.WebControls.DataGridPageChangedEventArgs e)

{
this.dgCommon.PageChange(dgdList, e);
}

// 排序
private void dgdList_SortCommand(object source, System.Web.UI.WebControls.DataGridSortCommandEventArgs e)

{
this.dgCommon.SortDataGrid(dgdList, e);
}

// 设置排序图标
private void dgdList_ItemCreated(object sender, System.Web.UI.WebControls.DataGridItemEventArgs e)

{
this.dgCommon.SetItemCreated(dgdList, e);
}
}
