c# winform DataGridView连oracle数据库分页成功解决,详细讲解

首先:拖到窗体里一个DataGridView 一个BindingNavigate和一个BindingSource控件,分别命名为dataGridView1、bdnInfo、bdsInfo。
然后:在bdnInfo控件上添加几个lable和textBox

在代码里要先定义几个变量

#region 全局变量都在这
//-------------------------------------------------------------------
int pageSize = 0; //每页显示行数
int nMax = 0; //总记录数
int pageCount = 0; //总页数=总记录数/每页显示行数
int pageCurrent = 0; //当前页号
int nCurrent = 0; //当前记录行
DataSet ds = new DataSet();
DataTable dt ;
OracleDataAdapter sda;
DBConnection dbc = new DBConnection();
//------------------------------------------------------------------

[code="c#"]#endregion


点了查询按钮把数据加载到DataGridView里,从数据源读取记录到DataTable中

#region 查询数据显示到DataGridView中

//点击查询按钮,也可以放在窗体加载事件中
private void button5_Click(object sender, EventArgs e)
{
Boolean allCheckBoxFalse = false;//判断复选框是否全部没有选中

string hphm = "";//号牌号码

if(checkBox1.Checked == true)
{
hphm = " and hphm = :textBox1";
}
else
{
hphm = "";
}

OracleConnection conn = dbc.getConnection();//获得conn连接

try
{
dt = new DataTable();
//注:bz为违法行为字段
sda = new OracleDataAdapter("SELECT xh,hpzl,hphm,bz,larq,fdjh,clpp,cjh,jdcsyr,cllx,csys FROM kk.kkhmd WHERE 1 = 1 " + hphm + " ",conn);//查询黑名单表

if (checkBox1.Checked == true)
{
sda.SelectCommand.Parameters.Add("textBox1", OracleType.VarChar).Value = textBox1.Text;//给hphm传参
}
else
{
}

sda.Fill(dt);
//如果查到了数据,才使控制分页按钮生效
if(dt.Rows.Count>0)
{
toolStripLabel4.Enabled = true;//首页启用
toolStripLabel1.Enabled = true;//上一页启用
toolStripTextBox1.Enabled = true;//当前页启用
label2.Enabled = true;//总页数启用
toolStripLabel2.Enabled = true;//下一页启用
toolStripLabel5.Enabled = true;//尾页启用
}
//如果没有查到数据,使控制分页按钮失效
else
{
toolStripLabel4.Enabled = false;//首页启用
toolStripLabel1.Enabled = false;//上一页启用
toolStripTextBox1.Enabled = false;//当前页启用
label2.Enabled = false;//总页数启用
toolStripLabel2.Enabled = false;//下一页启用
toolStripLabel5.Enabled = false;//尾页启用
}
dataGridView1.DataSource = dt;

InitDataSet();//开始分页
}
catch (Exception ee)
{
MessageBox.Show(ee.Message.ToString());
}
}

#endregion[/code]

用当前页面数据填充DataGridView

#endregion

#region  初始分页数据
//初始分页数据
private void InitDataSet()
{
pageSize = 20; //设置页面行数
nMax = dt.Rows.Count; //总记录数

pageCount = (nMax / pageSize); //计算出总页数

if ((nMax % pageSize) > 0) pageCount++;//如果有值,总页数++

pageCurrent = 1; //当前页数从1开始
nCurrent = 0; //当前记录数从0开始

LoadData();//执行分页功能显示出数据
}

#endregion

#region 执行分页功能显示出数据
//执行分页功能显示出数据
private void LoadData()
{
int nStartPos = 0; //当前页面开始记录行
int nEndPos = 0; //当前页面结束记录行

DataTable dtTemp = dt.Clone(); //克隆DataTable结构框架

if (pageCurrent == pageCount)//当前页数页数 == 总页数
nEndPos = nMax;//当前页面结束记录行 == 总记录数
else
nEndPos = pageSize * pageCurrent;//当前页面结束记录行 == 每页显示行数 * 当前页数页数

nStartPos = nCurrent;//当前页面开始记录行 == 当前记录行

label2.Text = pageCount.ToString();//总页数显示在label2上
toolStripTextBox1.Text = Convert.ToString(pageCurrent);//当前页数显示在文本框里

//从元数据源复制记录行
for (int i = nStartPos; i < nEndPos; i++)
{
dtTemp.ImportRow(dt.Rows[i]);
nCurrent++;
}
bdsInfo.DataSource = dtTemp;
bdnInfo.BindingSource = bdsInfo;
dataGridView1.DataSource = bdsInfo;
}

#endregion



菜单响应事件

#region 点击分页工具条
//点击分页工具条
private void bdnInfo_ItemClicked_1(object sender, ToolStripItemClickedEventArgs e)
{
//关闭当前窗体(在这里未加)
if (e.ClickedItem.Text == "关闭")
{
this.Close();
}
//点击上一页
if (e.ClickedItem.Text == "上一页")
{
pageCurrent--;//当前页号减1页
if (pageCurrent <= 0)//如果当前页号 不大于0了,就不能再上一页了,弹出提示
{
MessageBox.Show("已经是第一页,请点击“下一页”查看!","提示");
return;
}
//如果当前页号 大于0 就执行上一页命令
else
{
nCurrent = pageSize * (pageCurrent - 1);//当前记录行 == 每页显示行数 * (当前页号减1 )
}
LoadData();//执行分页功能显示出数据
}
//点击下一页
if (e.ClickedItem.Text == "下一页")
{
pageCurrent++;//当前页号加1页
if (pageCurrent > pageCount)//如果当前页号 大于 总页数 就不能再下一页了,弹出提示
{
MessageBox.Show("已经是最后一页,请点击“上一页”查看!", "提示");
return;
}
//如果当前页号 不大于 当前页数 就不能再下一页了,弹出提示
else
{
nCurrent = pageSize * (pageCurrent - 1);//当前记录行 == 每页显示行数 * (当前页号减1 )
}
LoadData();//执行分页功能显示出数据
}
//点击首页
if (e.ClickedItem.Text == "首页")
{
pageCurrent = 1;//当前页号设置为1
nCurrent = pageSize * (pageCurrent - 1); //当前记录行 == 每页显示行数 * (当前页号减1 )
LoadData();//执行分页功能显示出数据
}
if (e.ClickedItem.Text == "尾页")
{
pageCurrent = Convert.ToInt32(label2.Text);//当前页号设置为 总页数
nCurrent = pageSize * (pageCurrent - 1);//当前记录行 == 每页显示行数 * (当前页号减1 )
LoadData();执行分页功能显示出数据
}
}

#endregion


一些小技巧,label可以设置成超链接的形式,可以去掉超级链接的下划线,可以设置成没有数据的时候让工具条不可用,等有数据了再启用
可以设置工具条的样式,以跟窗体更好的融合,RenderMode为:System
点击工具条右上角那个小三角可以改变其GripStyle,改成Visible可以自动改变工具条的长度
设置工具条的事件ItemClicked,可以直接获得工具条上的控件信息,这样就可以统一管理不用给每个控件事件

使用#region可以折叠代码
在#region 和 #endregion 中的代码可以被折叠
#region 注释,可以使折叠后的代码带有注释说明

黑色头发:http://heisetoufa.iteye.com
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值