最近做了一个
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;
}
4
、菜单响应事件:
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,如需转载请自行联系原作者