C#自定义改写GridView的分页控件功能

来源:互联网 发布:排水管45度计算法图解 编辑:程序博客网 时间:2024/05/17 21:04

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Text;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Reflection;
using System.Text.RegularExpressions;

namespace ZLDK.JXGL.WebControls
{  
    [ToolboxData(
"<{0}:uGridView runat=server></{0}:uGridView>")]
    
public class uGridView : GridView, iuControl
    {
        
//委托事件
        public delegate void SelectNumberEventHandler(SelectNumberEventArgs e);

        
private static int summaryCount = 0//保存其数量值
        private Paging.PagingStyleCollection _pagingStyle; //是否要进行分页


        
#region 构造函数
        
public uGridView(): base()
        {
            ViewState[
"IsHandle"= true;
            ViewState[
"IsFixHeader"= true;
            
// 新增“uGridView_RowDataBound”事件处理
            this.RowDataBound += new GridViewRowEventHandler(uGridView_RowDataBound);
        }
        
#endregion

        
#region 属性
        [Bindable(
true)]
        [Category(
"Appearance")]
        [DefaultValue(
"")]
        [Localizable(
true)]
        
public string CodeID
        {
            
get
            {
                String s 
= (String)ViewState["CodeID"];
                
return ((s == null? String.Empty : s);
            }

            
set
            {
                ViewState[
"CodeID"= value;
            }
        }

        [Description(
"是否可以使用")]
        [DefaultValue(
true)]
        
public override bool Enabled
        {
            
get
            {
               
                
return base.Enabled;
            }
            
set
            {
                
if (IsHandle)
                    
base.Enabled = value;
            }
        }

        [Bindable(
true)]
        [Category(
"Appearance")]
        [DefaultValue(
true)]
        [Localizable(
true)]
        [Description(
"是否可以编程控制Enabled")]
        
public bool IsHandle
        {
            
get
            {
                
return (bool)ViewState["IsHandle"];
            }

            
set
            {
                ViewState[
"IsHandle"= value;
            }
        }

        
/// <summary>
        
/// 是否固定表头?
        
/// </summary>
        [Description("是否固定表头?"), Category("扩展"), DefaultValue(false), NotifyParentProperty(true)]
        
public virtual bool IsFixHeader
        {
            
get { return (bool)ViewState["IsFixHeader"]; }
            
set { ViewState["IsFixHeader"= value; }
        }
        
        
//获取记录总数
        [Description("数据总数"), DefaultValue("0"), Category("扩展")]
        
public int SummaryCount
        {
            
get { return summaryCount; }
            
set { summaryCount = value; }
        }

        
// 自定义分页样式     
        [Description("自定义分页样式"), DefaultValue("default"), Category("扩展")]
        
public Paging.PagingStyleCollection PagingStyle
        {
            
get { return _pagingStyle; }
            
set { _pagingStyle = value; }
        }

        
#endregion

        
#region 数据绑定事件

        
protected void uGridView_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            
//固定表头
            if (this.IsFixHeader && e.Row.RowType == DataControlRowType.Header)
            {
                
for (int j = 0; j < e.Row.Cells.Count; j++)
                {
                    e.Row.Cells[j].Attributes.Add(
"style"" position: relative; top: expression(this.offsetParent.scrollTop-1);");
                }
            }
        }

        
#endregion

        
#region 固定表头

        
protected override int CreateChildControls(System.Collections.IEnumerable dataSource, bool dataBinding)
        {
            
if (dataSource == null)
            {
                DataControlField[] fieldArray 
= new DataControlField[this.Columns.Count];
                
this.Columns.CopyTo(fieldArray, 0);

                
if (fieldArray != null && fieldArray.Length > 0)
                {
                    
if (this.ShowHeader && (this.HeaderRow == null))
                    {
                        GridViewRow headerRow 
= null;
                        
if (this.HeaderRow == null)
                        {
                            headerRow 
= this.CreateRow(-1-1, DataControlRowType.Header, DataControlRowState.Normal);
                            
this.InitializeRow(headerRow, fieldArray);
                            FieldInfo field 
= typeof(System.Web.UI.WebControls.GridView).GetField("_headerRow", BindingFlags.NonPublic | BindingFlags.Instance);
                            
if (field != null)
                            {
                                field.SetValue(
this, headerRow);
                            }
                            Table headerTable 
= this.CreateChildTable();
                            headerTable.Rows.Add(headerRow);
                            Controls.Add(headerTable);
                        }
                        
else
                        {
                            headerRow 
= this.HeaderRow;
                        }

                        GridViewRowEventArgs args 
= new GridViewRowEventArgs(headerRow);

                        
this.OnRowCreated(args);
                        
if (dataBinding)
                        {
                            headerRow.DataBind();
                            
this.OnRowDataBound(args);
                            headerRow.DataItem 
= null;
                        }
                    }
                }
                
return 0;
            }
            
else
            {
                
return base.CreateChildControls(dataSource, dataBinding);
            }
        }
        
#endregion

        
#region 创建分页的各个控件
        
/// <summary>
        
/// 创建分页的各个控件
        
/// </summary>
        
/// <param name="e"></param>
        protected override void OnRowCreated(GridViewRowEventArgs e)
        {
            
#region 自定义分页样式

            
if (e.Row.RowType == DataControlRowType.Pager && PagingStyle == Paging.PagingStyleCollection.Default)
            {
                LinkButton First 
= new LinkButton();
                First.ID 
= "First";
                First.ToolTip 
= "首页";
                First.CausesValidation 
= false;
                LinkButton Prev 
= new LinkButton();
                Prev.ID 
= "Prev";
                Prev.ToolTip 
= "后一页";
                Prev.CausesValidation 
= false;
                LinkButton Next 
= new LinkButton();
                Next.ID 
= "Next";
                Next.ToolTip 
= "前一页";
                Next.CausesValidation 
= false;
                LinkButton Last 
= new LinkButton();
                Last.ID 
= "Last";
                Last.ToolTip 
= "尾页";
                Last.CausesValidation 
= false;
                TableCell tc 
= new TableCell();

                e.Row.Controls.Clear();

                
#region “首页 上一页 下一页 尾页”按钮
                
if (!String.IsNullOrEmpty(PagerSettings.FirstPageImageUrl))
                {
                    First.Text 
= "<img src='" + ResolveUrl(PagerSettings.FirstPageImageUrl) + "' border='0'/>";
                }
                
else
                {
                    First.Text 
= PagerSettings.FirstPageText;
                   
// First.Text = "&lt;font face='webdings'&gt;9&lt;/font&gt;";

                }
                First.CommandName 
= "First";
                First.Font.Underline 
= false;

                
if (!String.IsNullOrEmpty(PagerSettings.PreviousPageImageUrl))
                {
                    Prev.Text 
= "<img src='" + ResolveUrl(PagerSettings.PreviousPageImageUrl) + "' border='0'/>";
                }
                
else
                {
                    Prev.Text 
= PagerSettings.PreviousPageText;
                   
// Prev.Text = "&lt;font face='webdings'&gt;3&lt;/font&gt;";
                }
                Prev.CommandName 
= "Prev";
                Prev.Font.Underline 
= false;


                
if (!String.IsNullOrEmpty(PagerSettings.NextPageImageUrl))
                {
                    Next.Text 
= "<img src='" + ResolveUrl(PagerSettings.NextPageImageUrl) + "' border='0'/>";
                }
                
else
                {
                   Next.Text 
= PagerSettings.NextPageText;
                   
//Next.Text = "&lt;font face='webdings'&gt;4&lt;/font&gt;";
                }
                Next.CommandName 
= "Next";
                Next.Font.Underline 
= false;

                
if (!String.IsNullOrEmpty(PagerSettings.LastPageImageUrl))
                {
                    Last.Text 
= "<img src='" + ResolveUrl(PagerSettings.LastPageImageUrl) + "' border='0'/>";
                }
                
else
                {
                    Last.Text 
= PagerSettings.LastPageText;
                    
//Last.Text = "&lt;font face='webdings'&gt;:&lt;/font&gt;";
                }
                Last.CommandName 
= "Last";
                Last.Font.Underline 
= false;


                tc.Controls.Add(First);
                tc.Controls.Add(
new LiteralControl("&nbsp;&nbsp;"));
                tc.Controls.Add(Prev);
                tc.Controls.Add(
new LiteralControl("&nbsp;&nbsp;"));

                
if (this.PageIndex <= 0)
                {
                    First.Enabled 
= Prev.Enabled = false;
                }
                
else
                {
                    First.Enabled 
= Prev.Enabled = true;
                }
                tc.Controls.Add(Next);
                tc.Controls.Add(
new LiteralControl("&nbsp;&nbsp;"));
                tc.Controls.Add(Last);
                tc.Controls.Add(
new LiteralControl("&nbsp;&nbsp;"));

                
if (this.PageIndex >= PageCount - 1)
                {
                    Next.Enabled 
= Last.Enabled = false;
                }
                
else
                {
                    Next.Enabled 
= Last.Enabled = true;
                }
                
#endregion

                
#region 显示总记录数 每页记录数 当前页数/总页数 /和加TextBox Button DropDownList控件

                tc.Controls.Add(
new LiteralControl((PageIndex + 1).ToString()));
                tc.Controls.Add(
new LiteralControl("/"));
                tc.Controls.Add(
new LiteralControl(PageCount.ToString()));
                tc.Controls.Add(
new LiteralControl("&nbsp;&nbsp;共<b>"));
                tc.Controls.Add(
new LiteralControl(SummaryCount.ToString()));
                tc.Controls.Add(
new LiteralControl("</b>条记录&nbsp;&nbsp;到"));
                
//添加输入框和按纽
                TextBox txbDigit = new TextBox();
                txbDigit.ID 
= "txbDigit";
                txbDigit.Style.Add(
"width""18px");
                
//txbDigit.Style.Add("height", "20px"); //height:20px;
                tc.Controls.Add(txbDigit);
                Button btnGoto 
= new Button();
                btnGoto.ID 
= "btnGoto";
                btnGoto.Text 
= "Go";
                btnGoto.ToolTip 
= "查询";
                btnGoto.Style.Add(
"cursor""hand");
                
//btnGoto.Style.Add("height", "25px");
                btnGoto.CommandName = "goto";
                btnGoto.CausesValidation 
= false;
                tc.Controls.Add(btnGoto);
                tc.Controls.Add(
new LiteralControl("&nbsp;&nbsp;每页显示"));
                
//使用下拉框来进行
                DropDownList ddlList = new DropDownList();
                ddlList.ID 
= "ddlList";
                ddlList.Items.Add(
new ListItem("10""10"));
                ddlList.Items.Add(
new ListItem("20""20"));
                ddlList.Items.Add(
new ListItem("30""30"));
                ddlList.Items.Add(
new ListItem("40""40"));
                ddlList.Items.Add(
new ListItem("50""50"));
                ddlList.SelectedValue 
= PageSize.ToString(); //显示行数
                ddlList.Style.Add("Width""40px");
                ddlList.AutoPostBack 
= true//触发其响应事件
                ddlList.SelectedIndexChanged += new EventHandler(DropDownList_SelectChanged);
                tc.Controls.Add(ddlList);
                tc.Controls.Add(
new LiteralControl("条记录"));
                
#endregion

                tc.ColumnSpan 
= this.Columns.Count;
                PagerStyle.HorizontalAlign 
= HorizontalAlign.Right; // 分页栏显示在右边
                e.Row.Controls.Add(tc);
             
            }


            
#endregion
            
base.OnRowCreated(e);
        }

        
#endregion

        
#region LinkButton和button的事件处理

        
protected override void OnRowCommand(GridViewCommandEventArgs e)
        {
            
//处理每个控件的事件,让前台来进行接收处理
            GridViewRow pagerRow = this.BottomPagerRow;
            LinkButton lbFirst 
= (LinkButton)pagerRow.FindControl("First");
            LinkButton lbPrev 
= (LinkButton)pagerRow.FindControl("Prev");
            LinkButton lbNext 
= (LinkButton)pagerRow.FindControl("Next");
            LinkButton lbLast 
= (LinkButton)pagerRow.FindControl("Last");

            
bool flag = true//通过使用标识来判断
            switch (e.CommandName)
            {
                
case "First":
                    
this.PageIndex = 0;
                    lbFirst.Enabled 
= lbPrev.Enabled = false;
                    lbNext.Enabled 
= lbLast.Enabled = true;
                    flag 
= true;

                    
break;
                
case "Prev":
                    
if (PageIndex >= 1)
                    {
                        
this.PageIndex = PageIndex - 1;
                        lbFirst.Enabled 
= lbPrev.Enabled = true;
                    }
                    
else
                    {
                        lbFirst.Enabled 
= lbPrev.Enabled = true;
                    }
                    lbNext.Enabled 
= lbLast.Enabled = true;
                    flag 
= true;
                    
break;
                
case "Next":
                    
if (PageIndex < PageCount - 1)
                    {
                        
this.PageIndex = PageIndex + 1;
                        lbNext.Enabled 
= lbLast.Enabled = true;
                    }
                    
else
                    {
                        lbNext.Enabled 
= lbLast.Enabled = false;
                    }
                    lbFirst.Enabled 
= lbPrev.Enabled = true;
                    flag 
= true;
                    
break;
                
case "Last":
                    
this.PageIndex = PageCount - 1;
                    lbFirst.Enabled 
= lbPrev.Enabled = true;
                    lbNext.Enabled 
= lbLast.Enabled = false;
                    flag 
= true;
                    
break;
                
case "goto":
                    TextBox txbContent 
= (TextBox)this.BottomPagerRow.FindControl("txbDigit");
                    
//使用正则表达式,验证输入的值
                    Match match = Regex.Match(txbContent.Text.Trim(), @"^[1-" + PageCount + "]$");
                    
if (match.Success)
                    {
                        
this.PageIndex = Convert.ToInt32(match.Value) - 1;
                        flag 
= true;
                    }
                    
else
                    {
                        flag 
= false;
                    }
                    
break;
            }
            
//调用前台事件
            if (flag)
            {
                
//重新加载数据
                EventArgs ea 
= new EventArgs();
                DataBindingClick(
this, ea);

            }


            
base.OnRowCommand(e);
        }

        
#endregion

        
#region 触发更新事件,用于LinkButtn和Button是触发事件

        
public event EventHandler ButtonClick;

        
protected virtual void DataBindingClick(object sender, EventArgs e)
        {
            
if (ButtonClick != null)
            {
                ButtonClick(sender, e);
            }
        }
  
        
#endregion

        
#region dropdownlist的事件处理

        
public event SelectNumberEventHandler SelectNumber;

        
protected virtual void SelectNumberChanged(SelectNumberEventArgs e)
        {
            
if (SelectNumber != null)
            {
                SelectNumber(e);
            }
        }


        
//把DropDownList选择得值返回给前台,让其进行操作,存入一个类中
        protected void DropDownList_SelectChanged(object sender, EventArgs e)
        {
            DropDownList ddlSelect 
= sender as DropDownList;
            SelectNumberEventArgs selectNum 
= new SelectNumberEventArgs(Convert.ToInt32(ddlSelect.SelectedValue));
            SelectNumberChanged(selectNum);

        }


        
#endregion


       
        
/// <summary>
        
///  注册控件有scriptManager的页面,这样几个控件才能激活,它必须在Gridview绑定后才能注册
        
/// </summary>
        
/// <param name="smRegister">注册的对象</param>
        public void RegisterControl(ScriptManager smRegister)
        {
            
try
            {
                
//注册触发控件
                GridViewRow gvr = this.BottomPagerRow;
                smRegister.RegisterAsyncPostBackControl(gvr.Cells[
0].FindControl("First"));
                smRegister.RegisterAsyncPostBackControl(gvr.Cells[
0].FindControl("Prev"));
                smRegister.RegisterAsyncPostBackControl(gvr.Cells[
0].FindControl("Next"));
                smRegister.RegisterAsyncPostBackControl(gvr.Cells[
0].FindControl("Last"));
                smRegister.RegisterAsyncPostBackControl(gvr.Cells[
0].FindControl("btnGoto"));
                smRegister.RegisterAsyncPostBackControl(gvr.Cells[
0].FindControl("ddlList"));
            }
            
catch
            { }

        }
    }

    /// <summary>
    /// 自定义分页相关
    /// </summary>
    public class Paging
    {
        /// <summary>
        /// 自定义分页样式
        /// </summary>
        public enum PagingStyleCollection
        {
            /// <summary>
            /// 不用自定义分页样式
            /// </summary>
            None,
            /// <summary>
            /// 默认自定义分页样式
            /// </summary>
            Default
        }
    }

    //用来存储dropdownList选择的数据
    public   class SelectNumberEventArgs: EventArgs
    {
        private int selectDigit;
        public SelectNumberEventArgs(int digit)
        {
            selectDigit = digit;
        }

        public int SelectNum
        {
            get
            {
                return selectDigit;
            }
        }
    }
}
 直接引用该uGridView,如果要想产生分页效果,那么几个属性必须设置
一个是AllowPaging="True" 和PagingStyle="default"
然后在HTML代码中加入样式,是指“首页、尾页”的显示样式
<PagerSettings  
            FirstPageText="&lt;font face='webdings'&gt;9&lt;/font&gt;" PreviousPageText="&lt;font face='webdings'&gt;3&lt;/font&gt;"
            NextPageText="&lt;font face='webdings'&gt;4&lt;/font&gt;" LastPageText="&lt;font face='webdings'&gt;:&lt;/font&gt;" />

然后对该uGridView两个事件进行代码操作,主要就是重新绑定数据源

    //加载客户信息
    private void setGridView(int pageSize)
    {
        
try
        {   
           
//根据选择条件得到数据
           clsST_JC_KHXX[] st_xx=ywJC_KHXX.stSelectOuterKeyJC_KHXX("2");
            
if (st_xx == null)
            {
                uGridView1.DataSource 
= null;
                uGridView1.DataBind();
                
return;
            }
  
//绑定数据源共有多少条记录,并在分页栏中显示
            uGridView1.SummaryCount = st_xx.Length;
//判断是否有每页显示的记录有否改变,如果改变必须把值直接赋给PageSize
            if (pageSize != 0)
            {
                uGridView1.PageSize 
= pageSize; 
            }
            uGridView1.DataSource 
= st_xx;
            uGridView1.DataBind();
            
        }
        
catch (Exception ex)
        {
            
throw ex;
        }
    }

双击uGridView中ButtonClick(LinkButton、Button的触发)和SelectNumber(DropDownList)事件
在ButtonClick事件下直接重新绑定

    protected void GridView1_ButtonClick(object sender, EventArgs e)
    {
        setGridView(
0);
    }

在SelectNumber事件下

    protected void GridView1_SelectNumber(ZLDK.JXGL.WebControls.SelectNumberEventArgs e)
    {
        setGridView(e.SelectNum); //e.SelectNum是dropDownList选择的值,              //ZLDK.JXGL.WebControls是命名控件下类SelectNumberEventArgs
    }
原创粉丝点击