|
先看一下用GridView排序、分页的效果图。 
下面给出具体实现的方法: 写一个定义控件,继承自System.Web.UI.WebControl.GridView,然后对其进行扩展。 分页的实现: 重写OnRowCreate方法,对PagerRow进行特殊处理,清空里面的控件,加入自己的控件。首页,尾页,上一页,下一页的做法是,往PagerRow中添加四个LinkButton,CommandName设成"Page",CommandArgument分别设成"First","Last","Prev","Next".相应的Text或者Image可直接使用PagerSettings属性中的数据。 直接跳转页和每页记录条数的实现相对麻烦一些。加入两个DropDownList控件,往里面填充数据,并在此类中处理它们的OnSelectedIndexChange事件,重置PageIndex和PageSize. 排序图标的实现: 同样在OnRowCreate方法中,对HeaderRow进行特殊处理,可根据SortExpression属性找到当前正在进行排序的列,根据SortDirection属性得到排序的顺序,根据这两个属性往特定的列添加特定的图标。 滚动条的实现: 重写RenderContents方法,改变原有的HTML流布局。如果不重写,原来的布局如下: <Table>//-->GridView

<tr>//-->PagerRow,当PagerPosition设成Top或TopAndBottom的时候,这一行才会出现

</tr>

<tr>//-->HeaderRow

</tr>

<tr>//-->DataRow

</tr>

............

<tr>//-->DataRow

</tr>

<tr>//-->FooterRow

</tr>

<tr>//-->PagerRow(Bottom || TopAndBottom时出现)

</Table>

 重写RenderContents的目的就是把整个GridView分隔成三(两)个Table,第一和第三个Table中放PagerRow部分,中间一个Table放在DIV中,固定DIV的高度,使其出现滚动条,对HeaderRow进行特殊处理,使其不会随滚动条的滚动而消失(方法是:style="top:expression(this.parentNode.parentNode.scrollTop);").然后再用一个Table把这三个Table包起来。重写后布局如下: <Table>

<tr>

<td>

<Table>PagerRow</Table>

</td>

<tr>

<tr>

<td>

<DIV>

<Table>DataRow && FooterRow</Table>

</DIV>

</td>

</tr>

<tr>

<td>

<Table>PagerRow</Table>

</td>

</tr>

</Table>


 接下来说一下具体实现: 1、新建一个Web Control Library类型的工程,命名为myControls,添加一个类myGridView.cs:代码如下: using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Collections;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.IO;
using System.ComponentModel;

namespace CRM2006.GridView
 ...{
 /**//// <summary>
/// Summary description for myGridView
/// </summary>
///
public class CrmGV : System.Web.UI.WebControls.GridView
 ...{
//private Unit _divheight;
//private int _offset;
private bool isPagerCreated = false;
public CrmGV()
 ...{
}
[
Description("是否启用自定义分页功能"),
Category("分页"), DefaultValue("false"),Themeable(true)
]
public bool AllowCustomerPagerSettings
 ...{
get
 ...{
object o = ViewState["AllowCustomerPagerSettings"];
return (o != null ? (bool)o : false);
}
set
 ...{
ViewState["AllowCustomerPagerSettings"] = value;
}
}
[Localizable(true), DefaultValue("Current page:"), Themeable(true)]
public string CurrentPageText
 ...{
get
 ...{
object o = ViewState["CurrentPageText"];
return (o != null ? o.ToString() : "Current page:");
}
set
 ...{
ViewState["CurrentPageText"] = value;
}
}
[Localizable(true), DefaultValue("Jump to page"), Themeable(true)]
public string JumpToPageText
 ...{
get
 ...{
object o = ViewState["JumpToPageText"];
return (o != null ? o.ToString() : "Jump to page");
}
set
 ...{
ViewState["JumpToPageText"] = value;
}
}
[Localizable(true), DefaultValue("Display{0}records per page"), Themeable(true)]
public string RecordCountPerPage
 ...{
get
 ...{
object o = ViewState["RecordCountPerPage"];
return (o != null ? o.ToString() : "Display{0}records per page");
}
set
 ...{
ViewState["RecordCountPerPage"] = value;
}
}
[Description("The height of DIV element"), Themeable(true)]
public virtual Unit DIVHeight
 ...{
get
 ...{
object o = ViewState["DIVHeight"];
return new Unit(o.ToString());
}
set
 ...{
ViewState["DIVHeight"] = value;
}
}
[Description("Image Url for sort ascending"),Themeable(true), Editor("System.Web.UI.Design.UrlEditor", typeof(System.Drawing.Design.UITypeEditor))]//Editro特性:指定用以改变属性的编辑器
public string SortAscImageUrl
 ...{
get
 ...{
object o = ViewState["SortImageAsc"];
return (o != null ? o.ToString() : "");
}
set
 ...{
ViewState["SortImageAsc"] = value;
}
}
[Description("Image Url for sort descending"),Themeable(true), Editor("System.Web.UI.Design.UrlEditor", typeof(System.Drawing.Design.UITypeEditor))]//Editro特性:指定用以改变属性的编辑器
public string SortDescImageUrl
 ...{
get
 ...{
object o = ViewState["SortImageDesc"];
return (o != null ? o.ToString() : "");
}
set
 ...{
ViewState["SortImageDesc"] = value;
}
}
[Description("OffSet Value of Head Row"), DefaultValue(4), Themeable(true)]
public int OffSet
 ...{
get
 ...{
object o = ViewState["OffSet"];
return Convert.ToUInt16(o);
}
set
 ...{
if (value <= 1)
ViewState["OffSet"] = 1;
else
ViewState["OffSet"] = value;
}
}
protected override void OnRowCreated(GridViewRowEventArgs e)
 ...{
if (e.Row.RowType == DataControlRowType.Pager)
 ...{
if (AllowCustomerPagerSettings)
 ...{
CreateCustomerPager(e.Row);
}

}
else
 ...{
if (e.Row.RowType == DataControlRowType.Header)
 ...{
DisplaySortOrderImages(e.Row);
}
}
base.OnRowCreated(e);
}
protected override void OnSorting(GridViewSortEventArgs e)
 ...{
base.OnSorting(e);
isPagerCreated = false;
}

private void CreateCustomerPager(GridViewRow pager)
 ...{
pager.Controls[0].Controls.Clear();
Table tb = new Table();
tb.Style.Add("width", "100%");
TableRow row=new TableRow();
pager.Controls[0].Controls.Add(tb);
tb.Rows.Add(row);
TableCell firstCell = new TableCell();
TableCell secCell = new TableCell();
TableCell tmpCell = new TableCell();
firstCell.Attributes["Align"] = "left";
secCell.Attributes["Align"]="right";
row.Cells.Add(firstCell);
row.Cells.Add(secCell);


tb = new Table();
firstCell.Controls.Add(tb);
row = new TableRow();
tb.Rows.Add(row);

LinkButton lnk = new LinkButton();
Label lbl = new Label();
Image img = new Image();

if (PageIndex != 0)
 ...{
//First
tmpCell = new TableCell();
tmpCell.Attributes["vAlign"] = "middle";
lnk.CommandArgument = "First";
lnk.CommandName = "Page";
lnk.CausesValidation = false;
if (PagerSettings.FirstPageImageUrl == String.Empty || PagerSettings.FirstPageImageUrl == null)
lnk.Text = (PagerSettings.FirstPageText == String.Empty || PagerSettings.FirstPageText == null ? "First" : PagerSettings.FirstPageText);
else
 ...{
img.ImageUrl = PagerSettings.FirstPageImageUrl;
lnk.Text = "";
lnk.Controls.Add(img);
}
tmpCell.Controls.Add(lnk);
row.Cells.Add(tmpCell);

//Preview
lnk = new LinkButton();
tmpCell = new TableCell();
tmpCell.Attributes["vAlign"] = "middle";
img = new Image();
lnk.CommandArgument = "Prev";
lnk.CommandName = "Page";
lnk.CausesValidation = false;
if (PagerSettings.PreviousPageImageUrl == String.Empty || PagerSettings.PreviousPageImageUrl == null)
lnk.Text = (PagerSettings.PreviousPageText == String.Empty || PagerSettings.PreviousPageText == null ? "Prev" : PagerSettings.PreviousPageText);
else
 ...{
img.ImageUrl = PagerSettings.PreviousPageImageUrl;
lnk.Text = "";
lnk.Controls.Add(img);
}
tmpCell.Controls.Add(lnk);
row.Cells.Add(tmpCell);
}

//Current
tmpCell = new TableCell();
& |