DataGridView使用自定义控件实现简单分页功能(推荐)
这篇文章主要介绍了DataGridView使用自定义控件实现简单分页功能,数据库使用的是sqlserver,本文通过通过实例代码给大家讲解的非常详细,需要的朋友参考下吧
本例子使用自定义控件方法实现,数据库使用的是SQL Server,实现过程如下:
1、新建一个自定义控件,命名为:PageControl。
2、PageControl代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 | public partial class PageControl : UserControl { //委托及事件 public delegate void BindPage( int pageSize, int pageIndex, out int totalCount); public event BindPage BindPageEvent; //属性 public int PageSize { get; set; } = 1 ; //每页显示记录数 public int PageIndex { get; set; } //页序号 public int TotalCount { get; set; } //总记录数 public int PageCount { get; set; } //总页数 public PageControl() { InitializeComponent(); //取消下划线 linkFirst.LinkBehavior = LinkBehavior.NeverUnderline; linkPrev.LinkBehavior = LinkBehavior.NeverUnderline; linkNext.LinkBehavior = LinkBehavior.NeverUnderline; linkLast.LinkBehavior = LinkBehavior.NeverUnderline; linkGo.LinkBehavior = LinkBehavior.NeverUnderline; } /// <summary> /// 设置页 /// </summary> public void SetPage() { //总记录数 int totalCount = 0 ; BindPageEvent(PageSize, PageIndex + 1 , out totalCount); TotalCount = totalCount; //总页数 if (TotalCount % PageSize == 0 ) PageCount = TotalCount / PageSize; else PageCount = TotalCount / PageSize + 1 ; //当前页及总页数 txtCurrentPage.Text = (PageIndex + 1 ).ToString(); lblTotalPage.Text = "共 " + PageCount.ToString() + " 页" ; } /// <summary> /// 首页 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void linkFirst_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) { if (e.Button == MouseButtons.Left) { PageIndex = 0 ; SetPage(); } } /// <summary> /// 上一页 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void linkPrve_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) { if (e.Button == MouseButtons.Left) { PageIndex--; if (PageIndex < 0 ) { PageIndex = 0 ; } SetPage(); } } /// <summary> /// 下一页 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void linkNext_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) { if (e.Button == MouseButtons.Left) { PageIndex++; if (PageIndex > PageCount - 1 ) { PageIndex = PageCount - 1 ; } SetPage(); } } /// <summary> /// 末页 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void linkLast_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) { if (e.Button == MouseButtons.Left) { PageIndex = PageCount - 1 ; SetPage(); } } /// <summary> /// 只能按0-9、Delete、Enter、Backspace键 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void txtSetPage_KeyPress(object sender, KeyPressEventArgs e) { if ((e.KeyChar >= 48 && e.KeyChar <= 57 ) || e.KeyChar == 8 || e.KeyChar == 13 || e.KeyChar == 127 ) { e.Handled = false ; if (e.KeyChar == 13 ) { Go(); } } else { e.Handled = true ; } } /// <summary> /// 指定页 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void linkGo_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) { if (e.Button == MouseButtons.Left) { Go(); } } private void Go() { if (string.IsNullOrEmpty(txtCurrentPage.Text)) { MessageBox.Show( "指定页不能为空。" , "提示" , MessageBoxButtons.OK, MessageBoxIcon.Information); txtCurrentPage.Focus(); return ; } if ( int .Parse(txtCurrentPage.Text) > PageCount) { MessageBox.Show( "指定页已超过总页数。" , "提示" , MessageBoxButtons.OK, MessageBoxIcon.Information); txtCurrentPage.Focus(); return ; } PageIndex = int .Parse(txtCurrentPage.Text) - 1 ; SetPage(); } /// <summary> /// linkFirst鼠标移过颜色 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void linkFirst_MouseMove(object sender, MouseEventArgs e) { linkFirst.LinkColor = Color.Red; } /// <summary> /// linkFirst鼠标离开颜色 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void linkFirst_MouseLeave(object sender, EventArgs e) { linkFirst.LinkColor = Color.Black; } /// <summary> /// linkPrev鼠标移过颜色 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void linkPrev_MouseMove(object sender, MouseEventArgs e) { linkPrev.LinkColor = Color.Red; } /// <summary> /// linkPrev鼠标离开颜色 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void linkPrev_MouseLeave(object sender, EventArgs e) { linkPrev.LinkColor = Color.Black; } /// <summary> /// linkNext鼠标移过颜色 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void linkNext_MouseMove(object sender, MouseEventArgs e) { linkNext.LinkColor = Color.Red; } /// <summary> /// linkNext鼠标离开颜色 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void linkNext_MouseLeave(object sender, EventArgs e) { linkNext.LinkColor = Color.Black; } /// <summary> /// linkLast鼠标移过颜色 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void linkLast_MouseMove(object sender, MouseEventArgs e) { linkLast.LinkColor = Color.Red; } /// <summary> /// linkLast鼠标离开颜色 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void linkLast_MouseLeave(object sender, EventArgs e) { linkLast.LinkColor = Color.Black; } /// <summary> /// linkGo鼠标移过颜色 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void linkGo_MouseMove(object sender, MouseEventArgs e) { linkGo.LinkColor = Color.Red; } /// <summary> /// linkGo鼠标离开颜色 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void linkGo_MouseLeave(object sender, EventArgs e) { linkGo.LinkColor = Color.Black; } } |
3、SQL Server创建存储过程PageTest:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | CREATE PROCEDURE [dbo].[PageTest] @PageSize INT, @PageIndex INT, @TotalCount INT OUTPUT AS BEGIN --总记录数 SELECT @TotalCount =COUNT( 1 ) FROM MF_MO --记录返回(使用动态SQL绕开参数嗅探问题,效率大幅度提升。) DECLARE @SQL NVARCHAR( 1000 ) SET @SQL = 'SELECT TOP (' +CONVERT(VARCHAR( 32 ), @PageSize )+ ') MO_NO,MRP_NO,QTY,BIL_NO ' + 'FROM MF_MO A ' + 'WHERE NOT EXISTS (SELECT 1 FROM (SELECT TOP (' +CONVERT(VARCHAR( 32 ),( @PageIndex - 1 )* @PageSize )+ ') MO_NO FROM MF_MO ORDER BY MO_NO) B WHERE A.MO_NO=B.MO_NO) ' + 'ORDER BY MO_NO' EXEC ( @SQL ) END |
4、新建一个WinForm程序,命名为Main,并拖入一个DataGridView控件及上面新建的PageControl控件,代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 | private void Main_Load(object sender, EventArgs e) { pageControl1.PageSize = 20 ; pageControl1.PageIndex = 0 ; pageControl1.BindPageEvent += BindPage; pageControl1.SetPage(); } /// <summary> /// 绑定页 /// </summary> /// <param name="pageSize">每页显示记录数</param> /// <param name="pageIndex">页序号</param> /// <param name="totalCount">总记录数</param> private void BindPage( int pageSize, int pageIndex, out int totalCount) { SqlConnection conn = null ; SqlCommand cmd = null ; totalCount = 0 ; #region 连接数据库测试 try { //数据库连接 conn = new SqlConnection( "server=.;database=DB_TEST;Uid=sa;pwd=********;" ); conn.Open(); //SqlCommand cmd = new SqlCommand(); cmd.Connection = conn; cmd.CommandText = "PageTest" ; cmd.CommandType = CommandType.StoredProcedure; SqlParameter[] param = { new SqlParameter( "@PageSize" ,SqlDbType.Int), new SqlParameter( "@PageIndex" ,SqlDbType.Int), new SqlParameter( "@TotalCount" ,SqlDbType.Int) }; param[ 0 ].Value = pageSize; param[ 1 ].Value = pageIndex; param[ 2 ].Direction = ParameterDirection.Output; cmd.Parameters.AddRange(param); //DataTable DataTable dt = new DataTable( "MF_MO" ); dt.Columns.Add( new DataColumn( "MO_NO" , typeof(String))); dt.Columns.Add( new DataColumn( "MRP_NO" , typeof(String))); dt.Columns.Add( new DataColumn( "QTY" , typeof(Decimal))); dt.Columns.Add( new DataColumn( "BIL_NO" , typeof(String))); #region 方法一:SqlDataReader SqlDataReader dr = cmd.ExecuteReader(); dt.Load(dr, LoadOption.PreserveChanges); dr.Close(); totalCount = ( int )param[ 2 ].Value; dataGridView1.DataSource = dt; #endregion #region #方法二:SqlDataAdapter //SqlDataAdapter da = new SqlDataAdapter(); //da.SelectCommand = cmd; //dt.BeginLoadData(); //da.Fill(dt); //dt.EndLoadData(); //totalCount = (int)param[2].Value; //dataGridView1.DataSource = dt; #endregion } catch (Exception ex) { MessageBox.Show(ex.Message, "提示" , MessageBoxButtons.OK, MessageBoxIcon.Information); } finally { conn.Close(); cmd.Dispose(); } #endregion } |
5、执行程序:
总结
以上所述是小编给大家介绍的DataGridView使用自定义控件实现简单分页功能,希望对大家有所帮助