C# DataGridView自定义分页控件

 好些日子不仔细写C#代码了,现在主要是Java项目,C#、Net相关项目不多了,有点手生了,以下代码不足之处望各位提出建议和批评。

  近日闲来无事想研究一下自定义控件,虽然之前也看过,那也仅限于皮毛,粗略的一览而已。在研究过程中渐渐地熟悉了自定义控件的相关流程、原理,于是开始自己动手去做一个。考虑到java web项目中经常用到分页查询功能进行数据展示,于是也想着结合自定义控件完成相同效果。当然了,数据导航控件C#已经有现成的,我现在制作此 控件仅仅是巩固练习,同时积累一下技术点,以备后用,各位也可以将对自己有用的部分"拿来"使用,一切都是“拿来主义”嘛,O(∩_∩)O哈哈~

  

  好了,言归正传!

  我看到其它各大博客里面各位博主也有关于DataGridView自定义分页控件的文章。虽然功能能实现,但是我觉得一是自定义控件代码太复杂,小白容易看晕;二是分页查询语句过于复杂,小白更容易看晕。现在就来说一下流程:

    1、创建数据库、数据表

    2、编写分页查询存储过程语句

    3、编写查询表记录个数存储过程语句

    4、编写自定义控件

  总的来说就以上三步,现在我们来细化一下。

创建数据库、数据表

  此处就不多说了,自行创建即可。

  例如我自己创建了一个测试表:

复制代码
 1 --创建数据表
 2 CREATE TABLE [dbo].[T_test](
 3     [id] [varchar](36) NOT NULL,
 4     [name] [nvarchar](50) NULL,
 5     [age] [int] NULL,
 6     [sex] [nvarchar](2) NULL,
 7     [address] [nvarchar](50) NULL,
 8     [job] [nvarchar](50) NULL,
 9  CONSTRAINT [PK_T_test] PRIMARY KEY CLUSTERED 
10 (
11     [id] ASC
12 )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
13 ) ON [PRIMARY]
14 
15 
16 --插入数据
17 INSERT [dbo].[T_test] ([id], [name], [age], [sex], [address], [job]) VALUES (N'273ff92e-0c60-4929-baaf-c53048e1b14a', N'张三', 23, N'男', N'济南市', NULL)
18 INSERT [dbo].[T_test] ([id], [name], [age], [sex], [address], [job]) VALUES (N'27d26321-767b-4760-855c-2dcb3a1d0e45', N'王鹏', 21, N'女', N'济南市', N'美工')
19 INSERT [dbo].[T_test] ([id], [name], [age], [sex], [address], [job]) VALUES (N'28022085-9aa2-4fac-8c5f-be8d4e129afb', N'陈豪', 25, N'男', N'泰安市', NULL)
20 INSERT [dbo].[T_test] ([id], [name], [age], [sex], [address], [job]) VALUES (N'3a7145bb-688f-4fa1-b8e9-ad167ddd5be2', N'郭富', 24, N'男', N'济南市', N'软件开发高级工程师')
21 INSERT [dbo].[T_test] ([id], [name], [age], [sex], [address], [job]) VALUES (N'4828099f-a56a-4fa6-86c0-7d8109b0c3b0', N'王志强', 25, N'男', N'泰安市', NULL)
22 INSERT [dbo].[T_test] ([id], [name], [age], [sex], [address], [job]) VALUES (N'593482c0-2610-4f50-8ff5-7e9b47031145', N'陈赫', 33, N'男', N'泰安市', NULL)
23 INSERT [dbo].[T_test] ([id], [name], [age], [sex], [address], [job]) VALUES (N'5c6351ef-6644-4948-82cc-d0f0e5b0d67e', N'陈斌', 29, N'女', N'济南市', NULL)
24 INSERT [dbo].[T_test] ([id], [name], [age], [sex], [address], [job]) VALUES (N'7063ac03-1057-4c09-946d-ed599c75eaf8', N'赵敏', 21, N'女', N'济南市', NULL)
25 INSERT [dbo].[T_test] ([id], [name], [age], [sex], [address], [job]) VALUES (N'724ce083-3370-47f1-a921-d31cbdc2c187', N'魏*栋', 26, N'女', N'济南市', N'临沂市')
26 INSERT [dbo].[T_test] ([id], [name], [age], [sex], [address], [job]) VALUES (N'744032d8-6906-42b7-aedb-e9215ea13962', N'小丽', 22, N'女', N'泰安市', N'UI设计师')
27 INSERT [dbo].[T_test] ([id], [name], [age], [sex], [address], [job]) VALUES (N'e67e4ea7-9a62-4869-8ca5-b30d45fc8ba4', N'马旭', 22, N'男', N'济南市', NULL)
28 INSERT [dbo].[T_test] ([id], [name], [age], [sex], [address], [job]) VALUES (N'edf7274c-cdad-4056-bd9a-27be06eb72f7', N'唐寒枫', 24, N'男', N'山东省临沂市', N'设计师')
29 INSERT [dbo].[T_test] ([id], [name], [age], [sex], [address], [job]) VALUES (N'fee2a0dd-1d93-4ed6-ad9e-6d8daa044311', N'王伟', 26, N'男', N'泰安市', NULL)
复制代码

编写分页查询存储过程语句

复制代码
 1     --分页查询存储过程
 2     if(exists(select* from sys.procedures where name='p_splitpage'))--如果存储过程存在
 3         drop proc p_splitpage  --删除存储过程
 4     go
 5     create proc p_splitpage(@pageSize  varchar(50), @currentPage  varchar(50),@tableName varchar(50))--创建存储过程,定义三个变量'每页显示的条数'、'当前页'、‘表名’
 6     as
 7     begin
 8         declare @sqlcommand varchar(max)     
 9         set @sqlcommand ='select  top '+@pageSize+' * from (select ROW_NUMBER() over(order by id) as rowid ,* from '+@tableName+')as A where rowid > ('+@pageSize+')*(('+@currentPage+')-1)'
10         exec(@sqlcommand )   
11     end
12     --分页查询存储过程
复制代码

测试:exec p_splitpage '10','1','T_test'

编写查询表记录个数存储过程语句

复制代码
 1     --查询表记录数
 2     if(exists(select* from sys.procedures where name='p_queryTableRecordCount'))
 3         drop proc p_queryTableRecordCount  --那么就删除这个存储过程
 4     go
 5     CREATE    proc p_queryTableRecordCount(@tablename  varchar(20))
 6     AS
 7     BEGIN
 8             declare @sqlcommand varchar(max)    
 9             set @sqlcommand ='select count(*) as 总记录数 from '+@tablename     
10             exec(@sqlcommand )     
11     END
12     GO
复制代码

测试:exec p_queryTableRecordCount 'T_test';

编写自定义控件

新建项目

添加用户控件类

绘制用户控件

这就是我们要绘制的用户控件,没进行美化操作,丑一点就丑一点吧,各位可自行美化处理。

编写代码

复制代码
  1 using System;
  2 using System.Collections.Generic;
  3 using System.ComponentModel;
  4 using System.Drawing;
  5 using System.Data;
  6 using System.Linq;
  7 using System.Text;
  8 using System.Threading.Tasks;
  9 using System.Windows.Forms;
 10 using System.Data.SqlClient;
 11 using DataHelper;
 12 
 13 namespace SX_ControlLibrary
 14 {
 15     public partial class DataNavigator : UserControl
 16     {
 17         public DataNavigator()
 18         {
 19             InitializeComponent();
 20         }
 21         #region 变量定义
 22         private int sx_totalCount = 0;//总数据个数
 23         private int sx_pageCount = 0;//总页数
 24         private int sx_currentPageCount = 0;//当前页数据记录数
 25         private int sx_currentPageIndex = 1;//当前页索引
 26         private int sx_pageSize = 10;//每页分页大小
 27         private int sx_yuShu = 0;//最后一页剩余个数
 28         private DataGridView sx_dataGirdView = null;
 29         private string sx_tableName = "";//DataGridViewd要绑定的表名
 30         private string sx_procSplitPageName = "";//DataGridViewd要绑定的分页存储过程名称
 31         private string sx_procQueryTableRecordCountName = "";//DataGridViewd要绑定的数据个数查询存储过程名称
 32         private bool sx_isAutoUpdateLabelTip = true;//获取或设置是否自动更新分页标签内容提示,默认为true
 33         #endregion
 34 
 35 
 36         #region 控件事件定义
 37         //[Category("SX"), Description("【上一页,<<】点击事件")]
 38         //public event EventHandler lbForwardClick;
 39 
 40         //[Category("SX"), Description("【下一页,>>】点击事件")]
 41         //public event EventHandler lbNextClick;
 42 
 43         //[Category("SX"), Description("【最后一页,>>|】点击事件")]
 44         //public event EventHandler lbLastClick;
 45 
 46         //[Category("SX"), Description("【首页,|<<】点击事件")]
 47         //public event EventHandler lbFirstClick;
 48 
 49         //[Category("SX"), Description("【显示记录数】修改事件")]
 50         //public event EventHandler txtPageCountKeyPress;
 51 
 52 
 53         /// <summary>
 54         /// 上一页
 55         /// </summary>
 56         /// <param name="sender"></param>
 57         /// <param name="e"></param>
 58         private void lbForward_Click(object sender, EventArgs e)
 59         {
 60             if (sx_currentPageIndex <= sx_pageCount && sx_currentPageIndex != 1)
 61                 sx_currentPageIndex--;
 62             Sx_initDataGirdView();
 63             if (Sx_IsAutoUpdateLabelTip)
 64                 Sx_updateSplitPageLabelTip();
 65         }
 66 
 67         /// <summary>
 68         /// 下一页
 69         /// </summary>
 70         /// <param name="sender"></param>
 71         /// <param name="e"></param>
 72         private void lbNext_Click(object sender, EventArgs e)
 73         {
 74             if (sx_currentPageIndex < sx_pageCount && sx_currentPageIndex != sx_pageCount)
 75                 sx_currentPageIndex++;
 76             Sx_initDataGirdView();
 77             if (Sx_IsAutoUpdateLabelTip)
 78                 Sx_updateSplitPageLabelTip();
 79         }
 80 
 81         /// <summary>
 82         /// 最后一页
 83         /// </summary>
 84         /// <param name="sender"></param>
 85         /// <param name="e"></param>
 86         private void lbLast_Click(object sender, EventArgs e)
 87         {
 88             sx_currentPageIndex = sx_pageCount;
 89             Sx_initDataGirdView();
 90         }
 91 
 92         /// <summary>
 93         /// 首页
 94         /// </summary>
 95         /// <param name="sender"></param>
 96         /// <param name="e"></param>
 97         private void lbFirst_Click(object sender, EventArgs e)
 98         {
 99             sx_currentPageIndex = 1;
100             Sx_initDataGirdView();
101         }
102 
103         private void txtPageCount_KeyPress(object sender, KeyPressEventArgs e)
104         {
105             if (e.KeyChar == '
')
106             {
107                 //TODO 判断处理   暂时不进行数据验证 
108                 sx_pageSize = Convert.ToInt32(txtPageCount.Text);
109                 calcPageInfo();
110                 Sx_initDataGirdView();
111             }
112         }
113         #endregion
114 
115 
116 
117         #region 属性定义
118         /// <summary>
119         /// 获取或设置是否自动更新分页标签内容提示,默认为true,false:不自动更新,可由开发者自行获取数据设置
120         /// </summary>
121         [Category("SX"), Description("获取或设置是否自动更新分页标签内容提示,默认为true,false:不自动更新,可由开发者自行获取数据设置"), Browsable(true)]
122         public bool Sx_IsAutoUpdateLabelTip
123         {
124             get { return sx_isAutoUpdateLabelTip; }
125             set { sx_isAutoUpdateLabelTip = value; }
126         }
127 
128 
129         /// <summary>
130         /// 获取或设置DataGridViewd要绑定的表名
131         /// </summary>
132         [Category("SX"), Description("获取或设置DataGridViewd要绑定的表名"), Browsable(true)]
133         public string Sx_tableName
134         {
135             get { return sx_tableName; }
136             set { sx_tableName = value; }
137         }
138 
139         /// <summary>
140         /// 获取或设置DataGridViewd要绑定的分页存储过程名称
141         /// </summary>
142         [Category("SX"), Description("获取或设置DataGridViewd要绑定的分页存储过程名称"), Browsable(true)]
143         public string Sx_procSplitPageName
144         {
145             get { return sx_procSplitPageName; }
146             set { sx_procSplitPageName = value; }
147         }
148 
149         /// <summary>
150         /// 获取或设置DataGridViewd要绑定的数据个数查询存储过程名称
151         /// </summary>
152         [Category("SX"), Description("获取或设置DataGridViewd要绑定的数据个数查询存储过程名称"), Browsable(true)]
153         public string Sx_procQueryTableRecordCountName
154         {
155             get { return sx_procQueryTableRecordCountName; }
156             set { sx_procQueryTableRecordCountName = value; }
157         }
158 
159         /// <summary>
160         /// 获取或设置DataGridViewd对象
161         /// </summary>
162         [Category("SX"), Description("获取或设置DataGridViewd对象"), Browsable(true)]
163         public DataGridView Sx_DataGridView
164         {
165             get { return sx_dataGirdView; }
166             set { sx_dataGirdView = value; }
167         }
168 
169         /// <summary>
170         /// 获取或设置分页提示标签内容
171         /// </summary>
172         [Category("SX"), Description("获取或设置分页提示标签内容"), Browsable(true)]
173         public string Sx_LbInfo
174         {
175             get { return lbInfo.Text; }
176             set
177             {
178                 lbInfo.Text = value.ToString();
179             }
180         }
181 
182         /// <summary>
183         /// 获取总数据个数控价对象
184         /// </summary>
185         [Category("SX"), Description("总数据个数控价对象"), Browsable(false)]
186         public TextBox Sx_TxtPageCount
187         {
188             get { return txtPageCount; }
189         }
190 
191 
192         /// <summary>
193         /// 获取或设置总数据个数
194         /// </summary>
195         [Category("SX_Field"), Description("获取或设置总数据个数"), Browsable(true)]
196         public int Sx_TotalCount
197         {
198             get { return sx_totalCount; }
199             set { sx_totalCount = value; }
200         }
201 
202         /// <summary>
203         /// 获取或设置总页数
204         /// </summary>获取或设置
205         [Category("SX_Field"), Description("获取或设置总页数"), Browsable(true)]
206         public int Sx_PageCount
207         {
208             get { return sx_pageCount; }
209             set { sx_pageCount = value; }
210         }
211 
212         /// <summary>
213         /// 获取或设置每页分页大小
214         /// </summary>
215         [Category("SX_Field"), Description("获取或设置每页分页大小"), Browsable(true)]
216         public int Sx_PageSize
217         {
218             get { return sx_pageSize; }
219             set
220             {
221                 sx_pageSize = value;
222                 txtPageCount.Text = value.ToString();
223             }
224         }
225 
226         /// <summary>
227         /// 获取或设置当前页数据记录数
228         /// </summary>
229         [Category("SX_Field"), Description("获取或设置当前页数据记录数"), Browsable(true)]
230         public int Sx_CurrentPageCount
231         {
232             get { return sx_currentPageCount; }
233             set { sx_currentPageCount = value; }
234         }
235 
236         /// <summary>
237         /// 获取或设置当前页索引
238         /// </summary>
239         [Category("SX_Field"), Description("获取或设置当前页索引"), Browsable(true)]
240         public int Sx_CurrentPageIndex
241         {
242             get { return sx_currentPageIndex; }
243             set { sx_currentPageIndex = value; }
244         }
245 
246         /// <summary>
247         /// 获取或设置最后一页剩余个数
248         /// </summary>
249         [Category("SX_Field"), Description("获取或设置最后一页剩余个数"), Browsable(true)]
250         public int Sx_YuShu
251         {
252             get { return sx_yuShu; }
253             set { sx_yuShu = value; }
254         }
255         #endregion
256 
257 
258 
259 
260         #region 方法
261 
262         /// <summary>
263         /// 调用存储过程(分页存储过程)初始化dataGirdView
264         /// </summary>
265         /// <param name="tableName">要绑定的表名</param>
266         /// <param name="procSplitPageName">分页查询的存储过程名称:p_splitPage</param>
267         /// <param name="procQueryTableRecordCountName">查询数据个数的存储过程名称:p_queryTableRecordCount</param>
268         public void Sx_initDataGirdView()
269         {
270             if (Sx_tableName.Length == 0)
271             {
272                 MessageBox.Show("initDataGirdView方法未指定表名!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
273             }
274             else
275             {
276                 SqlParameter[] sp = new SqlParameter[] {
277                      new SqlParameter("@pageSize",sx_pageSize),
278                      new SqlParameter("@currentPage",sx_currentPageIndex),
279                      new SqlParameter("@tableName",Sx_tableName)
280                 };
281                 sx_dataGirdView.DataSource = CommonDB.invokeProc_DataTable(Sx_procSplitPageName, sp);
282 
283                 #region dataGridView相关属性设置【抛出,不在此设置】
284                 //// 设置 dataGridView1 的第1列整列单元格为只读
285                 //dataGirdView.Columns[0].ReadOnly = true;
286                 //// 设定包括Header和所有单元格的列宽自动调整
287                 //dataGirdView.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;
288                 //// 设定包括Header和所有单元格的行高自动调整
289                 //dataGirdView.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells;
290                 #endregion
291 
292 
293                 //查询表记录数
294                 Sx_queryDataCount();
295 
296                 calcPageInfo();
297             }
298         }
299 
300         /// <summary>
301         /// 调用存储过程查询表记录数
302         /// </summary>
303         /// <param name="tableName">表名</param> 
304         /// <param name="p_queryTableRecordCountName">存储过程名称:p_queryTableRecordCount</param>
305         private void Sx_queryDataCount()
306         {
307             if ((Sx_tableName != null && Sx_tableName.Trim().Length != 0) && (Sx_procQueryTableRecordCountName != null && Sx_procQueryTableRecordCountName.Trim().Length != 0))
308             {
309                 //查询表记录数
310                 SqlParameter[] sp = new SqlParameter[] { new SqlParameter("@tableName", Sx_tableName) };
311                 object flag = CommonDB.invokeProc_ExecuteScalar(Sx_procQueryTableRecordCountName, sp);
312                 sx_totalCount = Convert.ToInt32(flag);
313             }
314             else
315             {
316                 MessageBox.Show("queryDataCount参数有误!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
317             }
318         }
319 
320 
321         public void Sx_updateSplitPageLabelTip()
322         {
323             lbInfo.Text = "总共" + sx_pageCount + "页" + ",当前第:" + sx_currentPageIndex + "页,其中最后一页有" + sx_yuShu + "条数据";
324         }
325 
326 
327         /// <summary>
328         /// 计算页信息
329         /// </summary>
330         /// <param name="totalCount">总记录数</param>
331         /// <param name="pageSize">每页要显示的条数</param>
332         private void calcPageInfo()
333         {
334             sx_pageCount = sx_totalCount / sx_pageSize; //取模
335             sx_yuShu = sx_totalCount % sx_pageSize;//取余
336             if (sx_yuShu > 0)
337             {
338                 sx_pageCount++;
339             }
340             Console.WriteLine("页大小:" + sx_pageSize);
341             Console.WriteLine("当前页索引:" + sx_currentPageIndex);
342             Console.WriteLine("pageCount:" + sx_totalCount + " / " + sx_pageSize + "=" + sx_pageCount);
343             Console.WriteLine("yuShu:" + sx_totalCount + " % " + sx_pageSize + "=" + sx_yuShu);
344             Console.WriteLine("总共" + sx_pageCount + "页" + ",当前第:" + sx_currentPageIndex + "页,其中最后一页有" + sx_yuShu + "条数据");
345 
346             if (Sx_IsAutoUpdateLabelTip)
347                 Sx_updateSplitPageLabelTip();
348         }
349 
350 
351 
352         #endregion
353     }
354 }
复制代码

用到的相关类库:CommonDB.cs

复制代码
  1 using System;
  2 using System.Collections.Generic;
  3 using System.Linq;
  4 using System.Text;
  5 using System.Threading.Tasks;
  6 using System.Windows.Forms;
  7 using System.Data.SqlClient;
  8 using System.Data;
  9 using System.Reflection;
 10 namespace DataHelper
 11 {
 12     public class CommonDB
 13     { 
 14         private static string connStr = "server=.;database=ERP_DB;Integrated security=true;Trusted_Connection=SSPI";
 15 
 16          
 17 
 18         /// <summary>
 19         /// 准备执行一个命令
 20         /// </summary>
 21         /// <param name="cmd">sql命令</param>
 22         /// <param name="conn">Sql连接</param>
 23         /// <param name="trans">Sql事务</param>
 24         /// <param name="cmdText">命令文本,例如:Select * from Products</param>
 25         /// <param name="cmdParms">执行命令的参数</param>
 26         private static void PrepareCommand(SqlCommand cmd, SqlConnection conn, SqlTransaction trans, CommandType cmdType, string cmdText, SqlParameter[] cmdParms)
 27         {
 28             //判断连接的状态。如果是关闭状态,则打开
 29             if (conn.State != ConnectionState.Open)
 30                 conn.Open();
 31             //cmd属性赋值
 32             cmd.Connection = conn;
 33             cmd.CommandText = cmdText;
 34             //是否需要用到事务处理
 35             if (trans != null)
 36                 cmd.Transaction = trans;
 37             //cmd.CommandType = CommandType.Text;
 38             cmd.CommandType = cmdType;
 39             //添加cmd需要的存储过程参数
 40             if (cmdParms != null)
 41             {
 42                 foreach (SqlParameter parm in cmdParms)
 43                     cmd.Parameters.Add(parm);
 44             }
 45         }
 46  
 47         /// <summary>
 48         /// 调用存储过程
 49         /// </summary>
 50         /// <param name="procName">存储过程名称</param>
 51         /// <param name="commandParameters">存储过程参数</param>
 52         /// <returns>返回受影响的行数</returns>
 53         public static int invokeProc_NonQuery(string procName, params SqlParameter[] commandParameters)
 54         {
 55             using (SqlConnection conn = new SqlConnection(connStr))
 56             {
 57                 SqlCommand sqlCmd = new SqlCommand();
 58                 PrepareCommand(sqlCmd, conn, null, CommandType.StoredProcedure, procName, commandParameters);
 59                 int flag = sqlCmd.ExecuteNonQuery();
 60                 sqlCmd.Parameters.Clear();
 61                 return flag;
 62             }
 63 
 64         }
 65 
 66         /// <summary>
 67         /// 调用存储过程
 68         /// </summary>
 69         /// <param name="procName">存储过程名称</param>
 70         /// <param name="commandParameters">存储过程参数</param>
 71         /// <returns>返回DataTable对象</returns>
 72         public static DataTable invokeProc_DataTable(string procName, params SqlParameter[] commandParameters)
 73         {
 74             using (SqlConnection conn = new SqlConnection(connStr))
 75             {
 76                 SqlCommand sqlCmd = new SqlCommand();
 77                 PrepareCommand(sqlCmd, conn, null, CommandType.StoredProcedure, procName, commandParameters);
 78                 SqlDataAdapter da = new SqlDataAdapter(sqlCmd);
 79                 DataTable dt = new DataTable();
 80                 try
 81                 {
 82                     //填充ds
 83                     da.Fill(dt);
 84                     // 清除cmd的参数集合 
 85                     sqlCmd.Parameters.Clear();
 86                     //返回ds
 87                     return dt;
 88                 }
 89                 catch (Exception ex)
 90                 {
 91                     LogLib.LogHelper.ERROR(ex);
 92                     //关闭连接,抛出异常
 93                     conn.Close();
 94                     throw;
 95                 }
 96             }
 97         }
 98 
 99 
100         /// <summary>
101         /// 调用存储过程。用指定的数据库连接执行一个命令并返回一个数据集的第一列
102         /// </summary>
103         /// <param name="procName"></param>
104         /// <param name="commandParameters"></param>
105         /// <returns>返回一个数据集的第一列</returns>
106         public static object invokeProc_ExecuteScalar(string procName, params SqlParameter[] commandParameters)
107         {
108 
109             using (SqlConnection conn = new SqlConnection(connStr))
110             {
111                 SqlCommand sqlCmd = new SqlCommand();
112                 PrepareCommand(sqlCmd, conn, null, CommandType.StoredProcedure, procName, commandParameters);
113                 object flag = sqlCmd.ExecuteScalar();
114                 sqlCmd.Parameters.Clear();
115                 return flag;
116             }
117 
118         }
119     }
120 }
复制代码

调用

新建一个winform窗体应用程序,拖入一个DataGirdView控件和刚才自定义控件,如下

代码:

复制代码
 1 using DataHelper;
 2 using System;
 3 using System.Collections.Generic;
 4 using System.ComponentModel;
 5 using System.Data;
 6 using System.Data.SqlClient;
 7 using System.Drawing;
 8 using System.Drawing.Drawing2D;
 9 using System.Linq;
10 using System.Text;
11 using System.Threading.Tasks;
12 using System.Windows.Forms;
13 
14 namespace TestProjrct
15 {
16     public partial class Form2 : Form
17     {
18         public Form2()
19         {
20             InitializeComponent();
21         }
22         
23         private void Form2_Load(object sender, EventArgs e)
24         {
25             //指定控件对象
26             dataNavigator1.Sx_DataGridView = dataGridView1;
27 
28             //可以在代码中设置dataGirdView控件属性,也可以在【属性】窗格设置
29             //dataNavigator1.Sx_tableName = "T_test";
30             //dataNavigator1.Sx_procQueryTableRecordCountName = "p_queryTableRecordCount";
31             //dataNavigator1.Sx_procSplitPageName = "p_splitPage";
32 
33 
34             //调用控件方法,绑定数据
35             dataNavigator1.Sx_initDataGirdView();
36 
37             // 设置 dataGridView1 的第1列整列单元格为只读
38             dataNavigator1.Sx_DataGridView.Columns[0].ReadOnly = true;
39             // 设定包括Header和所有单元格的列宽自动调整
40             dataNavigator1.Sx_DataGridView.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;
41             // 设定包括Header和所有单元格的行高自动调整
42             dataNavigator1.Sx_DataGridView.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells;
43 
44         }
45 
46     }
47 }
复制代码

可以看到,最终使用的时候代码很少,很简洁。只要创建好数据表以及相关存储过程(建议使用以上sql脚本用的存储过程默认名称,当然可以自定义)。

以上代码关键点有两个

一是:

dataNavigator1.Sx_DataGridView = dataGridView1;

 二是设置参数进行数据绑定:

//可以在代码中设置dataGirdView控件属性,也可以在【属性】窗格设置
//dataNavigator1.Sx_tableName = "T_test";
//dataNavigator1.Sx_procQueryTableRecordCountName = "p_queryTableRecordCount";
//dataNavigator1.Sx_procSplitPageName = "p_splitPage";
 dataNavigator1.Sx_initDataGirdView();

此处我在属性窗格进行设置的,如图:

当然可以代码设置,只需要将上面注释的代码(29~31行)打开即可。

37~42行进行相关特性设置,这个根据需要设置,非必须。


说明:

自定义控件的属性和相关方法都是以“Sx_”开头,便于查找,另外,相关注释说明也相对比较完善。

运行效果:

注意,以上“共:X条数据”没有动态更新,只要将属性Sx_IsAutoUpdateLabelTip改为true即可,代码设置也可以,属性表中设置也可以。改后:

原文地址:https://www.cnblogs.com/zxtceq/p/8125355.html