好些日子不仔细写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即可,代码设置也可以,属性表中设置也可以。改后:
本项目已提交至GitHub,地址:https://github.com/TangHanF/DataGirdViewSplitpageTools
有问题联系微信:g992470084
邮箱:guofu_gh@163.com