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();
//------------------------------------------------------------------

#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


用当前页面数据填充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

你可能感兴趣的:(oracle,C++,c,C#,WinForm)