• 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即可,代码设置也可以,属性表中设置也可以。改后:

    本项目已提交至GitHub,地址:https://github.com/TangHanF/DataGirdViewSplitpageTools 

    有问题联系微信:g992470084

    邮箱:guofu_gh@163.com

    转载请注明出处!谢谢配合!

  • 相关阅读:
    原生JS---2
    PHP中include和require绝对路径、相对路径问题
    魔方(小玩具)
    html5技术介绍
    苹果电脑 快捷键
    写代码的心得,怎么减少编程中的 bug?
    http状态代码含义表
    开源项目
    蓝牙 CoreBluetooth
    减小iOS应用程序的大小
  • 原文地址:https://www.cnblogs.com/geekworld/p/6197372.html
Copyright © 2020-2023  润新知