本文共 2317 字,大约阅读时间需要 7 分钟。
最近做了一个 DataGridView 的分页显示 Demo 。也是看见网络上很多人询问关于 DataGridView 如何做分页。根据我的认识, Visual Sutido 2005 里的 DataGridView 控件是没有带分页属性的,因此咱们必须通过写代码去实现分页功能。
好了,先看一下 Demo 的界面。
从界面可以看到,在设计时需要一个 DataGridView 、 BindingNavigate 、 BindingSource 控件,分别命名为 dgvInfo 、 bdnInfo 、 bdsInfo 。
在 bdnInfo 控件中添加几个用于选择页面的 lable 和 botton ,如上图所示。
设计时:
1 、定义几个所需的公有成员:
int pageSize = 0; // 每页显示行数
int nMax = 0; // 总记录数
int pageCount = 0; // 页数=总记录数 / 每页显示行数
int pageCurrent = 0; // 当前页号
int nCurrent = 0; // 当前记录行
DataSet ds = new DataSet();
DataTable dtInfo = new DataTable();
2 、在窗体载入事件中,从数据源读取记录到 DataTable 中:
string strConn = "SERVER=127.0.0.1;DATABASE=NORTHWIND;UID=SA;PWD=ULTRATEL"; // 数据库连接字符串
SqlConnection conn = new SqlConnection(strConn);
conn.Open();
string strSql = "SELECT * FROM CUSTOMERS";
SqlDataAdapter sda = new SqlDataAdapter(strSql,conn);
sda.Fill(ds,"ds");
conn.Close();
dtInfo = ds.Tables[0];
InitDataSet(); 3 、用当前页面数据填充 DataGridView
private void InitDataSet() { pageSize = 20; // 设置页面行数
nMax = dtInfo.Rows.Count;
pageCount=(nMax/pageSize); // 计算出总页数
if ((nMax % pageSize) > 0) pageCount++;
pageCurrent = 1; // 当前页数从 1 开始
nCurrent = 0; // 当前记录数从 0 开始
LoadData();
} private void LoadData() { int nStartPos = 0; // 当前页面开始记录行
int nEndPos = 0; // 当前页面结束记录行
DataTable dtTemp = dtInfo.Clone(); // 克隆 DataTable 结构框架
if (pageCurrent == pageCount)
nEndPos = nMax;
else
nEndPos = pageSize * pageCurrent;
nStartPos = nCurrent;
lblPageCount.Text = pageCount.ToString();
txtCurrentPage.Text = Convert.ToString(pageCurrent);
// 从元数据源复制记录行
for ( int i = nStartPos; i < nEndPos; i++)
{
dtTemp.ImportRow(dtInfo.Rows[i]);
nCurrent++;
}
bdsInfo.DataSource = dtTemp;
bdnInfo.BindingSource = bdsInfo;
dgvInfo.DataSource = bdsInfo;
} private void bdnInfo_ItemClicked(object sender, ToolStripItemClickedEventArgs e) { if (e.ClickedItem.Text == " 关闭 ")
{
this .Close();
}
if (e.ClickedItem.Text == " 上一页 ")
{
pageCurrent--;
if (pageCurrent <= 0)
{
MessageBox.Show(" 已经是第一页,请点击 “ 下一页 ” 查看! ");
return ;
}
else
{
nCurrent = pageSize * (pageCurrent - 1);
}
LoadData();
}
if (e.ClickedItem.Text == " 下一页 ")
{
pageCurrent++;
if (pageCurrent > pageCount)
{
MessageBox.Show(" 已经是最后一页,请点击 “ 上一页 ” 查看! ");
return ;
}
else
{
nCurrent=pageSize*(pageCurrent-1);
}
LoadData();
}
} 本文转自 qianshao 51CTO博客,原文链接:http://blog.51cto.com/qianshao/201800,如需转载请自行联系原作者