作为开发人员,我们在做系统的时候,在系统的某些页面上显示大量的数据几乎是不可避免的。由于当数据量很大时,不仅会把页面整体效果,还增加了页面的加载时间,用户也不可能一下子看那么多的数据。于是,就有了分页。

我们知道.net的gridview控件有分页功能。但是这个控件的分页效率是非常低下的。每次依然是读取数据库中的全部符合条件的数据,然后在内存中对取出来的大量的数据进行处理,得到显示在页面上的数据,这就是所谓的假分页。

考虑到系统的性能,大部分开发人员是不会采用这一种分页方式的。他们采用的是在数据库里进行分页,将page index 和page size 信息传入SQL,这是取出来的数据就直接是合适的数据,直接绑定在页面控件上就可以。但是这一种方法就会产生一个页面导航的问题。不同的人有不同的做法,很可能会导致一个系统里的页面里的页面导航显示风格不一致,同时会产生大量的代码冗余。

为了解决页面导航的问题,我试着自己做了一个页面导航的用户控件。控件的大致显示效果如下:

主要的导航控件代码分享如下:

View Code
  1     public partial class UC_PageNavi : System.Web.UI.UserControl
  2     {
  3         private Int32 pageCount;
  4         /// <summary>
  5         /// the page total count. 
  6         /// </summary>
  7         public Int32 PageCount
  8         {
  9             get { return pageCount; }
 10             set { pageCount = value; }
 11         }
 12 
 13         /// <summary>
 14         /// refresh page binding data
 15         /// </summary>
 16         public delegate void RefreshData(Int32 CurrentPage,int PageSize);
 17 
 18         public event RefreshData OnrefreshData;
 19 
 20         public void RegisterFreshDataEvent()
 21         {
 22             if (OnrefreshData == null)
 23             {
 24  
 25             }
 26         }
 27 
 28         /// <summary>
 29         /// excute the delegate function and refresh the total pagecount info.
 30         /// </summary>
 31         private void Excutedelegate()
 32         {
 33             OnrefreshData.Invoke(Convert.ToInt32(LblCurrent.Text), Convert.ToInt16(DdlPageSize.SelectedItem.Value));
 34             if (this.pageCount > 0)
 35             {
 36                 LblTotal.Text = this.pageCount.ToString();
 37             }
 38             else
 39             {
 40                 LblTotal.Text = "1";
 41             }
 42         }
 43 
 44         protected void Page_Load(object sender, EventArgs e)
 45         {
 46             if (!IsPostBack)
 47             {
 48                 LblCurrent.Text = "1";
 49                 if (OnrefreshData != null)
 50                 {//excute the delegate function
 51                     Excutedelegate();
 52                 }
 53             }
 54 
 55         }
 56 
 57         /// <summary>
 58         /// go to first page
 59         /// </summary>
 60         /// <param name="sender"></param>
 61         /// <param name="e"></param>
 62         protected void BtnFirst_Click(object sender, EventArgs e)
 63         {
 64             LblCurrent.Text = "1";
 65             LbtnEnableControl();
 66             if (OnrefreshData != null)
 67             {
 68                 Excutedelegate();
 69             }
 70         }
 71 
 72         /// <summary>
 73         /// go to previous page
 74         /// </summary>
 75         /// <param name="sender"></param>
 76         /// <param name="e"></param>
 77         protected void BtnPre_Click(object sender, EventArgs e)
 78         {
 79             if (LblCurrent.Text != "1")
 80             {
 81                 LblCurrent.Text = (Convert.ToInt32(LblCurrent.Text) - 1).ToString();
 82             }
 83             LbtnEnableControl();
 84             if (OnrefreshData != null)
 85             {
 86                 Excutedelegate();
 87             }
 88         }
 89 
 90         /// <summary>
 91         /// go to next page
 92         /// </summary>
 93         /// <param name="sender"></param>
 94         /// <param name="e"></param>
 95         protected void BtnNext_Click(object sender, EventArgs e)
 96         {
 97             LblCurrent.Text = (Convert.ToInt32(LblCurrent.Text) + 1).ToString();
 98             LbtnEnableControl();
 99             if (OnrefreshData != null)
100             {
101                 Excutedelegate();
102             }
103         }
104 
105         /// <summary>
106         /// go to last page
107         /// </summary>
108         /// <param name="sender"></param>
109         /// <param name="e"></param>
110         protected void BtnLast_Click(object sender, EventArgs e)
111         {
112             LblCurrent.Text = LblTotal.Text;
113             LbtnEnableControl();
114             if (OnrefreshData != null)
115             {
116                 Excutedelegate();
117             }
118         }
119 
120         /// <summary>
121         /// go to the designated page
122         /// </summary>
123         /// <param name="sender"></param>
124         /// <param name="e"></param>
125         protected void BtnPageTo_Click(object sender, EventArgs e)
126         {
127             int intpageto;
128             if (int.TryParse(TxtPageTo.Text.Trim(), out intpageto))
129             {
130 
131             }
132             else
133             {
134                 ScriptManager.RegisterStartupScript(this, this.GetType(), "JS", "<script>alert('请输入正确的数字!');</script>", false);
135             }
136             if (intpageto <= Convert.ToInt32(LblTotal.Text))
137             {
138                 LblCurrent.Text = intpageto.ToString();
139             }
140             else
141             {
142                 LblCurrent.Text = LblTotal.Text;
143             }
144             LbtnEnableControl();
145             if (OnrefreshData != null)
146             {
147                 Excutedelegate();
148             }
149         }
150 
151         /// <summary>
152         /// set the enable property of linkbutton according to page index and total pagecount
153         /// </summary>
154         private void LbtnEnableControl()
155         {
156             if (LblCurrent.Text == "1" && LblTotal.Text == "1")
157             {
158                 BtnFirst.Enabled = false;
159                 BtnPre.Enabled = false;
160                 BtnNext.Enabled = false;
161                 BtnLast.Enabled = false;
162             }
163             else if (LblCurrent.Text == "1" && LblTotal.Text!="1")
164             {
165                 BtnFirst.Enabled = false;
166                 BtnPre.Enabled = false;
167                 BtnNext.Enabled = true;
168                 BtnLast.Enabled = true;
169             }
170             else if (LblCurrent.Text != "1" && LblCurrent.Text == LblTotal.Text)
171             {
172                 BtnFirst.Enabled = true;
173                 BtnPre.Enabled = true;
174                 BtnNext.Enabled = false;
175                 BtnLast.Enabled = false;
176             }
177             else
178             {
179                 BtnFirst.Enabled = true;
180                 BtnPre.Enabled = true;
181                 BtnNext.Enabled = true;
182                 BtnLast.Enabled = true;
183             }
184         }
185     }

下面是如何调用?在引用了这个控件的页面,加入下面的代码:

View Code
 1         protected void Page_Load(object sender, EventArgs e)
 2         {
 3             UC_Nevigate.OnrefreshData += DataBind;
 4         }
 5 
 6         public void DataBind(int intCurrentPage, int PageSize)
 7         {
 8             int IntTotalPage;
 9             string StrSql = "select (select reviewlevel.levelmark from reviewlevel where reviewlevel.levelid=basicresult.totallevel) as 评审结果 from basicresult";
10             GridView1.DataSource = DbHelper.GetDataByPage(StrSql, null, intCurrentPage, PageSize, out IntTotalPage);
11             GridView1.DataBind();
12             UC_Nevigate.PageCount = IntTotalPage;
13         }

其中,那个SQL要换成自己的SQL,同时DBhelper是一个访问数据类,这个类里有一个分页方法。

控件的不足:

控件的样式不能用户控制,没能够提供几种合适的样式供用户选择;

委托方法应该写一个注册器,只能注册唯一一个可用的方法。现在会注册多个绑定方法。

委托方法最好专递一个Object对象。

存在的不足,后面在做优化,今天下班。。