最近很多朋友聊到在winform中使用Datagridview控件实现的分页的问题,对于数据之间的关系比较头疼,以下是我个人完成得分页代码,和大家共享,希望对有需要的朋友有所帮助。
使用的控件有BindingNavigator,BindingSource和BindingSource,数据库使用SQL SERVER2008,数据源于一个点歌系统的歌手信息列表,即songInfo,下面是代码和部分注释。
public partial class FrmMain : Form
{
int pageSize = 0;//定义每页显示的行数
int nMax = 0;//总记录行
int pageCount = 0;//页数=总记录数/每页显示的记录
int pageCurrent = 0;//当前页号;
int ncurrent = 0;//当前记录行
DataSet ds=new DataSet();//数据集
DataTable dtInfo = new DataTable();//创建表,表示内存中的一个表
public FrmMain()
{
InitializeComponent();//初始化
}
private void Form1_Load(object sender, EventArgs e)
{
DBHelper dbhelper = new DBHelper();
string sql = "select song_id,song_name from song_info";
SqlDataAdapter adapter = new SqlDataAdapter(sql,dbhelper.Connection);
adapter.Fill(ds,"ds");
dtInfo=ds.Tables[0];//把数据集中虚拟表的内容付给表dtInfo
InitDataSet();
}
private void InitDataSet()
{
pageSize = 10;//设置每页行数
nMax = dtInfo.Rows.Count;//计算总行数
pageCount = (nMax / pageSize);//计算出总页数
if (nMax % pageSize > 0)//有余数,有一页没有满
{
pageCount++;//单独作为一页
}
pageCurrent = 1;//当前页号从第一页开始
ncurrent = 0;//当前记录行初始值
LoadData();
}
private void LoadData()
{
int start = 0;//当前页面记录行;
int end = 0;//当前页面结束行
DataTable dtTemp = dtInfo.Clone();//复制表给dtTemp
if (pageCurrent == pageCount)//当前页号是最后一页
{
end = nMax;//结束行是总行数
}
else
{
end = pageSize * pageCurrent;//结束行是当前页数*每页行数
}
start = ncurrent;//当前记录行
lblCount.Text = pageCount.ToString();
txtPagecount.Text = Convert.ToString(pageCurrent);
for (int i = start; i < end; 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();
}
}
}
以上是个人完成得一个分页效果,有不妥之处希望各位不吝赐教!