前言:这是我写的第一篇技术文章,目前正在学习C#,还属于基础加强阶段,希望可以通过撰写博客加深自己对于所学知识点的理解,并尽量详细的把自己的学习过程与大家分享,希望能够与大家一起分享交流学习心得。
当我们从sql数据库中读取的数据量较多,并需要在页面中展示出来时,在一页上全部显示未免有点冗余,所以为了方便用户查看,可以实现分页浏览的功能,具体需求如下。
实现过程分析
1.实现效果
WinForm窗体每页显示3条数据效果图如下所示:
First表示首页;Last表示尾页;Prev表示前一页;Next表示后一页;最后一栏为combox,可由用户选择每页显示的数据条数
2.实现过程
创建表TblTeacher,表中包含tTId(编号)、tTName(姓名)、tTGender(性别)、tTAge(年龄)、tTSalary(薪资)、tTBirthday(生日)6个字段,其中tTId为主键。
封装SqlHelper类
应用程序配置文件中配置连接字符串
在使用数据库时,连接字符串需多次使用到,将其写进配置文件中后,在程序中只需通过一句代码就可访问到。在App.config中configuration节点下添加如下代码段:
<connectionStrings>
<add name="cl" connectionString="Data Source=(local);Initial Catalog=ItCastCn;User ID=sa;Password=123456"/>
</connectionStrings>
GetConn() 获取数据库连接,返回SqlConnection类型
ExecuteNonQuery(string sql) 执行sql语句,返回受影响的行数int类型
ExecuteNonQuery(string sql, CommandType type, params SqlParameter[] ps) 执行参数化的sql语句或者存储过程,返回受影响的行数int类型
ExecuteScalar(string sql, params SqlParameter[] ps) 执行参数化的sql语句,返回首行首列的值object类型
GetDataTable(string sql, Dictionary<string, string> dic) 执行参数化的sql语句,返回DataTable类型的结果集
private static SqlConnection GetConn()
return new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["cl"].ConnectionString);
/// <summary>
/// 获取受影响的行数,不带参数,执行sql语句
/// </summary>
/// <returns></returns>
public static int ExecuteNonQuery(string sql)
return ExecuteNonQuery(sql, CommandType.Text, null);
/// <summary>
/// 获取受影响的行数,带参数,选择执行的是存储过程还是普通的sql语句
/// </summary>
/// <param name="sql"></param>
/// <param name="ps"></param>
/// <returns></returns>
public static int ExecuteNonQuery(string sql, CommandType type, params SqlParameter[] ps)
int rows = -1;
using (SqlConnection conn = GetConn())
SqlCommand cmd = new SqlCommand(sql, conn);
//定义执行语句的类型
cmd.CommandType = type;
if (ps != null)
cmd.Parameters.AddRange(ps);
conn.Open();
rows = cmd.ExecuteNonQuery();
return rows;
/// <summary>
/// 获取首行首列的值
/// </summary>
/// <param name="sql"></param>
/// <param name="ps"></param>
/// <returns></returns>
public static object ExecuteScalar(string sql, params SqlParameter[] ps)
object obj = null;
using (SqlConnection conn = GetConn())
SqlCommand cmd = new SqlCommand(sql, conn);
if (ps != null)
cmd.Parameters.AddRange(ps);
conn.Open();
obj = cmd.ExecuteScalar();
return obj;
/// <summary>
/// 获取一个结果集
/// </summary>
/// <param name="sql"></param>
/// <param name="ps"></param>
/// <returns></returns>
public static DataTable GetDataTable(string sql, Dictionary<string, string> dic)
DataTable dt = new DataTable();
using (SqlConnection conn = GetConn())
SqlDataAdapter adapter = new SqlDataAdapter(sql, conn);
if (dic != null)
SqlParameter[] ps = new SqlParameter[dic.Count];
int index = 0;
foreach (var item in dic)
ps[index++] = new SqlParameter(item.Key, item.Value);
adapter.SelectCommand.Parameters.AddRange(ps);
conn.Open();
adapter.Fill(dt);
return dt;
控件点击事件
菜单栏子项点击后的触发事件,通过Text属性判断当前要去第几页。
//填充数据到datagridview
private void fillToolStripMenuItem_Click(object sender, EventArgs e)
string sql = "select * from Teacher_Index";
DataTable dt = SqlHelper.GetDataTable(sql, null);
dataGridView1.DataSource = dt;
//当前显示的页码
int page_index;
//判断选择的是首页、尾页、前一页、后一页
private void Page_Click(object sender, EventArgs e)
//根据combox的内容获取一页的行数
int page_size = Convert.ToInt32(MS_page_size.Text);
//获取总的数据行数
int rows = GetCount();
//获取能得到的最多的页数
int max_rowindex = rows % page_size == 0 ? rows / page_size : rows / page_size + 1;
ToolStripMenuItem page = sender as ToolStripMenuItem;
switch (page.Text)
case "First":
page_index = 1;
break;
case "Last":
page_index = max_rowindex;
break;
//前一页
case "Prev":
if (page_index <= 1)
//已经是首页
page_index = 1;
page_index--;
break;
//下一页
case "Next":
if (page_index >= max_rowindex)
//已经是尾页
page_index = max_rowindex;
page_index++;
break;
//指定dataGridView1的数据源
dataGridView1.DataSource = GetData();
//获取指定行的数据
private DataTable GetData()
int page_size = Convert.ToInt32(MS_page_size.Text);
//获取指定列数的内容
string sql = "select * from Teacher_Index where row_index between @startindex and @endindex";
//给参数赋值
Dictionary<string, string> dic = new Dictionary<string, string>();
dic.Add("@startindex", (page_size * (page_index - 1)+1).ToString());
dic.Add("@endindex", (page_size * page_index).ToString());
return SqlHelper.GetDataTable(sql, dic);
private void Form1_Load(object sender, EventArgs e)
//初始化显示第一页
page_index = 1;
//默认每页显示3行数据。因本次试验数据较少,所以选择每页显示3、4、5条数据
MS_page_size.SelectedIndex = 0;
//获取数据行数
private int GetCount()
int rows = 0;
//获取表的行数
string sql = "select COUNT(*) from Teacher_Index";
rows = Convert.ToInt32(SqlHelper.ExecuteScalar(sql, null));
return rows;
复制代码
3.总结
至此,已可实现从数据库中读取数据并将其分页浏览,可由用户自定义选择每页显示的数据条数,方便查询。