作为开发人员,我们在做系统的时候,在系统的某些页面上显示大量的数据几乎是不可避免的。由于当数据量很大时,不仅会把页面整体效果,还增加了页面的加载时间,用户也不可能一下子看那么多的数据。于是,就有了分页。
我们知道.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对象。
存在的不足,后面在做优化,今天下班。。
A pure heart will go far.