第一:GridView 多列排序与排序图标显示
首先我们可以新建一个类库程序,主要需要引用System.Web.Dll文件
然后新建一个类,这个类继承与GridView控件,我们只需要对部分方法进行重新即可。
我的演示的例子,采用了单列排序,如果启用多列排序,把控件的AllowMultiColumnSorting设置为True就是
多列排序。
public
class
WebGridView:GridView
... {
属性属性#region 属性
/**//**//**//// <summary>
/// 是否启用或者禁止多列排序
/// </summary>
[
Description("是否启用多列排序功能"),
Category("排序"),
DefaultValue("false"),
]
public bool AllowMultiColumnSorting
...{
get
...{
object o = ViewState["EnableMultiColumnSorting"];
return (o != null ? (bool)o : false);
}
set
...{
AllowSorting = true;
ViewState["EnableMultiColumnSorting"] = value;
}
}
/**//**//**//// <summary>
/// 升序时显示图标
/// </summary>
[
Description("升序时显示图标"),
Category("排序"),
Editor("System.Web.UI.Design.UrlEditor", typeof(System.Drawing.Design.UITypeEditor)),
DefaultValue(""),
]
public string SortAscImageUrl
...{
get
...{
object o = ViewState["SortImageAsc"];
return (o != null ? o.ToString() : "");
}
set
...{
ViewState["SortImageAsc"] = value;
}
}
/**//**//**//// <summary>
/// 降序时显示图标
/// </summary>
[
Description("降序时显示图标"),
Category("排序"),
Editor("System.Web.UI.Design.UrlEditor", typeof(System.Drawing.Design.UITypeEditor)),
DefaultValue(""),
]
public string SortDescImageUrl
...{
get
...{
object o = ViewState["SortImageDesc"];
return (o != null ? o.ToString() : "");
}
set
...{
ViewState["SortImageDesc"] = value;
}
}
#endregion
重写方法重写方法#region 重写方法
protected override void OnSorting(GridViewSortEventArgs e)
...{
if (AllowMultiColumnSorting)
...{
e.SortExpression = GetSortExpression(e);
}
base.OnSorting(e);
}
protected override void OnRowCreated(GridViewRowEventArgs e)
...{
if (e.Row.RowType == DataControlRowType.Header)
...{
if (SortExpression != String.Empty)
...{
DisplaySortOrderImages(SortExpression, e.Row);
this.CreateRow(0, 0, DataControlRowType.EmptyDataRow, DataControlRowState.Normal);
}
}
base.OnRowCreated(e);
}
#endregion
受保护的方法受保护的方法#region 受保护的方法
/**//**//**//// <summary>
/// 获取排序表达式
/// </summary>
protected string GetSortExpression(GridViewSortEventArgs e)
...{
string[] sortColumns = null;
string sortAttribute = SortExpression;
if (sortAttribute != String.Empty)
...{
sortColumns = sortAttribute.Split(",".ToCharArray());
}
if (sortAttribute.IndexOf(e.SortExpression) > 0 || sortAttribute.StartsWith(e.SortExpression))
...{
sortAttribute = ModifySortExpression(sortColumns, e.SortExpression);
}
else
...{
sortAttribute += String.Concat(",", e.SortExpression, " ASC ");
}
return sortAttribute.TrimStart(",".ToCharArray()).TrimEnd(",".ToCharArray());
}
/**//**//**//// <summary>
/// 修改排序顺序
/// </summary>
protected string ModifySortExpression(string[] sortColumns, string sortExpression)
...{
string ascSortExpression = String.Concat(sortExpression, " ASC ");
string descSortExpression = String.Concat(sortExpression, " DESC ");
for (int i = 0; i < sortColumns.Length; i++)
...{
if (ascSortExpression.Equals(sortColumns[i]))
...{
sortColumns[i] = descSortExpression;
}
else if (descSortExpression.Equals(sortColumns[i]))
...{
Array.Clear(sortColumns, i, 1);
}
}
return String.Join(",", sortColumns).Replace(",,", ",").TrimStart(",".ToCharArray());
}
/**//**//**//// <summary>
/// 获取当前的表达式对所选列进行排序
/// </summary>
protected void SearchSortExpression(string[] sortColumns, string sortColumn, out string sortOrder, out int sortOrderNo)
...{
sortOrder = "";
sortOrderNo = -1;
for (int i = 0; i < sortColumns.Length; i++)
...{
if (sortColumns[i].StartsWith(sortColumn))
...{
sortOrderNo = i + 1;
if (AllowMultiColumnSorting)
...{
sortOrder = sortColumns[i].Substring(sortColumn.Length).Trim();
}
else
...{
sortOrder = ((SortDirection == SortDirection.Ascending) ? "ASC" : "DESC");
}
}
}
}
/**//**//**//// <summary>
/// 绘制升序降序的图片
/// </summary>
protected void DisplaySortOrderImages(string sortExpression, GridViewRow dgItem)
...{
string[] sortColumns = sortExpression.Split(",".ToCharArray());
for (int i = 0; i < dgItem.Cells.Count; i++)
...{
if (dgItem.Cells[i].Controls.Count > 0 && dgItem.Cells[i].Controls[0] is LinkButton)
...{
string sortOrder;
int sortOrderNo;
string column = ((LinkButton)dgItem.Cells[i].Controls[0]).CommandArgument;
SearchSortExpression(sortColumns, column, out sortOrder, out sortOrderNo);
if (sortOrderNo > 0)
...{
string sortImgLoc = (sortOrder.Equals("ASC") ? SortAscImageUrl : SortDescImageUrl);
if (sortImgLoc != String.Empty)
...{
Image imgSortDirection = new Image();
imgSortDirection.ImageUrl = sortImgLoc;
dgItem.Cells[i].Controls.Add(imgSortDirection);
}
else
...{
if (AllowMultiColumnSorting)
...{
Literal litSortSeq = new Literal();
litSortSeq.Text = sortOrderNo.ToString();
dgItem.Cells[i].Controls.Add(litSortSeq);
}
}
}
}
}
}
#endregion
}
... {
属性属性#region 属性
/**//**//**//// <summary>
/// 是否启用或者禁止多列排序
/// </summary>
[
Description("是否启用多列排序功能"),
Category("排序"),
DefaultValue("false"),
]
public bool AllowMultiColumnSorting
...{
get
...{
object o = ViewState["EnableMultiColumnSorting"];
return (o != null ? (bool)o : false);
}
set
...{
AllowSorting = true;
ViewState["EnableMultiColumnSorting"] = value;
}
}
/**//**//**//// <summary>
/// 升序时显示图标
/// </summary>
[
Description("升序时显示图标"),
Category("排序"),
Editor("System.Web.UI.Design.UrlEditor", typeof(System.Drawing.Design.UITypeEditor)),
DefaultValue(""),
]
public string SortAscImageUrl
...{
get
...{
object o = ViewState["SortImageAsc"];
return (o != null ? o.ToString() : "");
}
set
...{
ViewState["SortImageAsc"] = value;
}
}
/**//**//**//// <summary>
/// 降序时显示图标
/// </summary>
[
Description("降序时显示图标"),
Category("排序"),
Editor("System.Web.UI.Design.UrlEditor", typeof(System.Drawing.Design.UITypeEditor)),
DefaultValue(""),
]
public string SortDescImageUrl
...{
get
...{
object o = ViewState["SortImageDesc"];
return (o != null ? o.ToString() : "");
}
set
...{
ViewState["SortImageDesc"] = value;
}
}
#endregion
重写方法重写方法#region 重写方法
protected override void OnSorting(GridViewSortEventArgs e)
...{
if (AllowMultiColumnSorting)
...{
e.SortExpression = GetSortExpression(e);
}
base.OnSorting(e);
}
protected override void OnRowCreated(GridViewRowEventArgs e)
...{
if (e.Row.RowType == DataControlRowType.Header)
...{
if (SortExpression != String.Empty)
...{
DisplaySortOrderImages(SortExpression, e.Row);
this.CreateRow(0, 0, DataControlRowType.EmptyDataRow, DataControlRowState.Normal);
}
}
base.OnRowCreated(e);
}
#endregion
受保护的方法受保护的方法#region 受保护的方法
/**//**//**//// <summary>
/// 获取排序表达式
/// </summary>
protected string GetSortExpression(GridViewSortEventArgs e)
...{
string[] sortColumns = null;
string sortAttribute = SortExpression;
if (sortAttribute != String.Empty)
...{
sortColumns = sortAttribute.Split(",".ToCharArray());
}
if (sortAttribute.IndexOf(e.SortExpression) > 0 || sortAttribute.StartsWith(e.SortExpression))
...{
sortAttribute = ModifySortExpression(sortColumns, e.SortExpression);
}
else
...{
sortAttribute += String.Concat(",", e.SortExpression, " ASC ");
}
return sortAttribute.TrimStart(",".ToCharArray()).TrimEnd(",".ToCharArray());
}
/**//**//**//// <summary>
/// 修改排序顺序
/// </summary>
protected string ModifySortExpression(string[] sortColumns, string sortExpression)
...{
string ascSortExpression = String.Concat(sortExpression, " ASC ");
string descSortExpression = String.Concat(sortExpression, " DESC ");
for (int i = 0; i < sortColumns.Length; i++)
...{
if (ascSortExpression.Equals(sortColumns[i]))
...{
sortColumns[i] = descSortExpression;
}
else if (descSortExpression.Equals(sortColumns[i]))
...{
Array.Clear(sortColumns, i, 1);
}
}
return String.Join(",", sortColumns).Replace(",,", ",").TrimStart(",".ToCharArray());
}
/**//**//**//// <summary>
/// 获取当前的表达式对所选列进行排序
/// </summary>
protected void SearchSortExpression(string[] sortColumns, string sortColumn, out string sortOrder, out int sortOrderNo)
...{
sortOrder = "";
sortOrderNo = -1;
for (int i = 0; i < sortColumns.Length; i++)
...{
if (sortColumns[i].StartsWith(sortColumn))
...{
sortOrderNo = i + 1;
if (AllowMultiColumnSorting)
...{
sortOrder = sortColumns[i].Substring(sortColumn.Length).Trim();
}
else
...{
sortOrder = ((SortDirection == SortDirection.Ascending) ? "ASC" : "DESC");
}
}
}
}
/**//**//**//// <summary>
/// 绘制升序降序的图片
/// </summary>
protected void DisplaySortOrderImages(string sortExpression, GridViewRow dgItem)
...{
string[] sortColumns = sortExpression.Split(",".ToCharArray());
for (int i = 0; i < dgItem.Cells.Count; i++)
...{
if (dgItem.Cells[i].Controls.Count > 0 && dgItem.Cells[i].Controls[0] is LinkButton)
...{
string sortOrder;
int sortOrderNo;
string column = ((LinkButton)dgItem.Cells[i].Controls[0]).CommandArgument;
SearchSortExpression(sortColumns, column, out sortOrder, out sortOrderNo);
if (sortOrderNo > 0)
...{
string sortImgLoc = (sortOrder.Equals("ASC") ? SortAscImageUrl : SortDescImageUrl);
if (sortImgLoc != String.Empty)
...{
Image imgSortDirection = new Image();
imgSortDirection.ImageUrl = sortImgLoc;
dgItem.Cells[i].Controls.Add(imgSortDirection);
}
else
...{
if (AllowMultiColumnSorting)
...{
Literal litSortSeq = new Literal();
litSortSeq.Text = sortOrderNo.ToString();
dgItem.Cells[i].Controls.Add(litSortSeq);
}
}
}
}
}
}
#endregion
}
下面是多列排序与分页显示代码的演示
<
script runat
=
"
server
"
>
void PageDropDownList_SelectedIndexChanged(Object sender, EventArgs e)
... {
GridViewRow pagerRow = CustomersGridView.BottomPagerRow;
DropDownList pageList = (DropDownList)pagerRow.Cells[0].FindControl("PageDropDownList");
CustomersGridView.PageIndex = pageList.SelectedIndex;
}
void CustomersGridView_DataBound(Object sender, EventArgs e)
... {
GridViewRow pagerRow = CustomersGridView.BottomPagerRow;
LinkButton linkBtnFirst = (LinkButton)pagerRow.Cells[0].FindControl("linkBtnFirst");
LinkButton linkBtnPrev = (LinkButton)pagerRow.Cells[0].FindControl("linkBtnPrev");
LinkButton linkBtnNext = (LinkButton)pagerRow.Cells[0].FindControl("linkBtnNext");
LinkButton linkBtnLast = (LinkButton)pagerRow.Cells[0].FindControl("linkBtnLast");
if (CustomersGridView.PageIndex == 0)
...{
linkBtnFirst.Enabled = false;
linkBtnPrev.Enabled = false;
}
else if (CustomersGridView.PageIndex == CustomersGridView.PageCount-1)
...{
linkBtnLast.Enabled = false;
linkBtnNext.Enabled = false;
}
else if (CustomersGridView.PageCount<=0)
...{
linkBtnFirst.Enabled = false;
linkBtnPrev.Enabled = false;
linkBtnNext.Enabled = false;
linkBtnLast.Enabled = false;
}
DropDownList pageList = (DropDownList)pagerRow.Cells[0].FindControl("PageDropDownList");
Label pageLabel = (Label)pagerRow.Cells[0].FindControl("CurrentPageLabel");
if (pageList != null)
...{
for (int i = 0; i < CustomersGridView.PageCount; i++)
...{
int pageNumber = i + 1;
ListItem item = new ListItem(pageNumber.ToString() + "/" + CustomersGridView.PageCount.ToString(), pageNumber.ToString());
if (i == CustomersGridView.PageIndex)
...{
item.Selected = true;
}
pageList.Items.Add(item);
}
}
if (pageLabel != null)
...{
int currentPage = CustomersGridView.PageIndex + 1;
pageLabel.Text = "当前页: " + currentPage.ToString() +
" / " + CustomersGridView.PageCount.ToString();
}
}
</ script >
< html >
< body >
< form id = " Form1 " runat = " server " >
< h3 >
GridView PagerTemplate Example </ h3 >
< asp:WebGridView ID = " CustomersGridView " DataSourceID = " CustomersSqlDataSource " AutoGenerateColumns = " true "
AllowPaging = " true " OnDataBound = " CustomersGridView_DataBound " SortAscImageUrl = " ~imagesarrow-up.gif " SortDescImageUrl = " ~imagesarrow-down.gif " runat = " server " AllowSorting = " True " Width = " 723px " >
< PagerStyle ForeColor = " Blue " BackColor = " LightBlue " />
< PagerTemplate >
< table width = " 100% " >
< tr >
< td width = " 70% " >
< asp:Label ID = " MessageLabel " ForeColor = " Blue " Text = " 页码: " runat = " server " />
< asp:DropDownList ID = " PageDropDownList " AutoPostBack = " true " OnSelectedIndexChanged = " PageDropDownList_SelectedIndexChanged "
runat = " server " />
< asp:LinkButton CommandName = " Page " CommandArgument = " First " ID = " linkBtnFirst " runat = " server " > 首页 </ asp:LinkButton >
< asp:LinkButton CommandName = " Page " CommandArgument = " Prev " ID = " linkBtnPrev " runat = " server " > 上一页 </ asp:LinkButton >
< asp:LinkButton CommandName = " Page " CommandArgument = " Next " ID = " linkBtnNext " runat = " server " > 下一页 </ asp:LinkButton >
< asp:LinkButton CommandName = " Page " CommandArgument = " Last " ID = " linkBtnLast " runat = " server " > 末页 </ asp:LinkButton >
</ td >
< td width = " 70% " align = " right " >
< asp:Label ID = " CurrentPageLabel " ForeColor = " Blue " runat = " server " />
</ td >
</ tr >
</ table >
</ PagerTemplate >
</ asp:WebGridView >
< asp:SqlDataSource ID = " CustomersSqlDataSource " SelectCommand = " Select [CustomerID], [CompanyName], [Address], [City], [PostalCode], [Country] From [Customers] "
ConnectionString = " <%$ ConnectionStrings:NorthWindConnectionString%> " runat = " server " >
</ asp:SqlDataSource >
</ form >
</ body >
</ html >
void PageDropDownList_SelectedIndexChanged(Object sender, EventArgs e)
... {
GridViewRow pagerRow = CustomersGridView.BottomPagerRow;
DropDownList pageList = (DropDownList)pagerRow.Cells[0].FindControl("PageDropDownList");
CustomersGridView.PageIndex = pageList.SelectedIndex;
}
void CustomersGridView_DataBound(Object sender, EventArgs e)
... {
GridViewRow pagerRow = CustomersGridView.BottomPagerRow;
LinkButton linkBtnFirst = (LinkButton)pagerRow.Cells[0].FindControl("linkBtnFirst");
LinkButton linkBtnPrev = (LinkButton)pagerRow.Cells[0].FindControl("linkBtnPrev");
LinkButton linkBtnNext = (LinkButton)pagerRow.Cells[0].FindControl("linkBtnNext");
LinkButton linkBtnLast = (LinkButton)pagerRow.Cells[0].FindControl("linkBtnLast");
if (CustomersGridView.PageIndex == 0)
...{
linkBtnFirst.Enabled = false;
linkBtnPrev.Enabled = false;
}
else if (CustomersGridView.PageIndex == CustomersGridView.PageCount-1)
...{
linkBtnLast.Enabled = false;
linkBtnNext.Enabled = false;
}
else if (CustomersGridView.PageCount<=0)
...{
linkBtnFirst.Enabled = false;
linkBtnPrev.Enabled = false;
linkBtnNext.Enabled = false;
linkBtnLast.Enabled = false;
}
DropDownList pageList = (DropDownList)pagerRow.Cells[0].FindControl("PageDropDownList");
Label pageLabel = (Label)pagerRow.Cells[0].FindControl("CurrentPageLabel");
if (pageList != null)
...{
for (int i = 0; i < CustomersGridView.PageCount; i++)
...{
int pageNumber = i + 1;
ListItem item = new ListItem(pageNumber.ToString() + "/" + CustomersGridView.PageCount.ToString(), pageNumber.ToString());
if (i == CustomersGridView.PageIndex)
...{
item.Selected = true;
}
pageList.Items.Add(item);
}
}
if (pageLabel != null)
...{
int currentPage = CustomersGridView.PageIndex + 1;
pageLabel.Text = "当前页: " + currentPage.ToString() +
" / " + CustomersGridView.PageCount.ToString();
}
}
</ script >
< html >
< body >
< form id = " Form1 " runat = " server " >
< h3 >
GridView PagerTemplate Example </ h3 >
< asp:WebGridView ID = " CustomersGridView " DataSourceID = " CustomersSqlDataSource " AutoGenerateColumns = " true "
AllowPaging = " true " OnDataBound = " CustomersGridView_DataBound " SortAscImageUrl = " ~imagesarrow-up.gif " SortDescImageUrl = " ~imagesarrow-down.gif " runat = " server " AllowSorting = " True " Width = " 723px " >
< PagerStyle ForeColor = " Blue " BackColor = " LightBlue " />
< PagerTemplate >
< table width = " 100% " >
< tr >
< td width = " 70% " >
< asp:Label ID = " MessageLabel " ForeColor = " Blue " Text = " 页码: " runat = " server " />
< asp:DropDownList ID = " PageDropDownList " AutoPostBack = " true " OnSelectedIndexChanged = " PageDropDownList_SelectedIndexChanged "
runat = " server " />
< asp:LinkButton CommandName = " Page " CommandArgument = " First " ID = " linkBtnFirst " runat = " server " > 首页 </ asp:LinkButton >
< asp:LinkButton CommandName = " Page " CommandArgument = " Prev " ID = " linkBtnPrev " runat = " server " > 上一页 </ asp:LinkButton >
< asp:LinkButton CommandName = " Page " CommandArgument = " Next " ID = " linkBtnNext " runat = " server " > 下一页 </ asp:LinkButton >
< asp:LinkButton CommandName = " Page " CommandArgument = " Last " ID = " linkBtnLast " runat = " server " > 末页 </ asp:LinkButton >
</ td >
< td width = " 70% " align = " right " >
< asp:Label ID = " CurrentPageLabel " ForeColor = " Blue " runat = " server " />
</ td >
</ tr >
</ table >
</ PagerTemplate >
</ asp:WebGridView >
< asp:SqlDataSource ID = " CustomersSqlDataSource " SelectCommand = " Select [CustomerID], [CompanyName], [Address], [City], [PostalCode], [Country] From [Customers] "
ConnectionString = " <%$ ConnectionStrings:NorthWindConnectionString%> " runat = " server " >
</ asp:SqlDataSource >
</ form >
</ body >
</ html >