C#中的DataGridView中添加按钮并操作数据_datagridview添加按钮-程序员宅基地

技术标签: c#  服务器  开发语言  

目录

背景

一、在DataGridView中显示需要的按钮

二、给DataGridView添加事件,可以通过按钮来操作数据库

三、在按钮上鼠标箭头变成小手样式

四、总结


背景

最近在项目中有需求需要在DataGridView中添加“删除”、“修改”按钮,用来对数据的操作以及显示。

一、在DataGridView中显示需要的按钮

 首先在DataGridView中添加需要的列,此列是用来存放按钮的。

在DataGridView中显示按钮可以提供一种直观和交互性强的用户界面。通过在DataGridView中添加按钮列,可以在每一行的特定单元格中显示按钮,并在点击按钮时执行相应的操作。

按钮可以用作一级标题,以提供一种快速访问和操作数据的方式。例如,可以在每一行的按钮列中添加一个"编辑"按钮,使用户能够快速编辑该行的数据。另外,还可以添加其他按钮,如"删除"按钮、"查看详情"按钮等,以满足不同的需求。

这些按钮可以通过设置DataGridViewButtonColumn的属性来自定义。可以设置按钮列的标题、按钮上显示的文本、按钮的样式等。通过设置按钮列的事件处理程序,可以在按钮被点击时执行相应的操作。例如,可以在按钮的点击事件中弹出编辑窗口,或者直接更新数据库中的数据。

通过在DataGridView中显示需要的按钮,可以提供一种直观和方便的操作界面,使用户能够快速访问和操作数据。这种方式可以大大提高用户的工作效率和用户体验。

然后在代码中“画”按钮。

if (e.ColumnIndex >= 0 && e.RowIndex >= 0)
            {
                if (this.dgvwProdCode.Columns[e.ColumnIndex].Name == "act")
                {
                    StringFormat sf = StringFormat.GenericDefault.Clone() as StringFormat;//设置重绘入单元格的字体样式
                    sf.FormatFlags = StringFormatFlags.DisplayFormatControl;
                    sf.Alignment = StringAlignment.Center;
                    sf.LineAlignment = StringAlignment.Center;
                    sf.Trimming = StringTrimming.EllipsisCharacter;

                    e.PaintBackground(e.CellBounds, true);//重绘边框

                    //设置要写入字体的大小
                    System.Drawing.Font myFont = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
                    SizeF sizeDel = e.Graphics.MeasureString("删除", myFont);
                    SizeF sizeMod = e.Graphics.MeasureString("修改", myFont);
                    SizeF sizeIsEnable = e.Graphics.MeasureString("启用/禁用", myFont);

                    float fDel = sizeDel.Width / (sizeDel.Width + sizeMod.Width + sizeIsEnable.Width); //
                    float fMod = sizeMod.Width / (sizeDel.Width + sizeMod.Width + sizeIsEnable.Width);
                    float fIsEnable = sizeIsEnable.Width / (sizeDel.Width + sizeMod.Width+ sizeIsEnable.Width);

                    //设置每个“按钮的边界”
                    RectangleF rectDel = new RectangleF(e.CellBounds.Left, e.CellBounds.Top, e.CellBounds.Width * fDel, e.CellBounds.Height);
                    RectangleF rectMod = new RectangleF(rectDel.Right, e.CellBounds.Top, e.CellBounds.Width * fMod, e.CellBounds.Height);
                    
                    RectangleF rectIsEnable = new RectangleF(rectMod.Right, e.CellBounds.Top, e.CellBounds.Width* fIsEnable, e.CellBounds.Height);
                    e.Graphics.DrawString("删除", myFont, Brushes.Black, rectDel, sf); //绘制“按钮”
                    e.Graphics.DrawString("修改", myFont, Brushes.Black, rectMod, sf);
                    e.Graphics.DrawString("启用/禁用", myFont, Brushes.Black, rectIsEnable, sf);
                    e.Handled = true;
                }
            }

以上代码是在DataGridView中可以显示需要的按钮。

二、给DataGridView添加事件,可以通过按钮来操作数据库

使用CellMouseClick方法来去执行事件。

通过在DataGridView中添加事件,可以通过按钮来操作数据库。这种方式可以为用户提供一种方便的界面,使用户能够通过点击按钮来执行数据库操作,如插入、更新或删除数据。

首先,需要在DataGridView中添加一个按钮列。可以通过创建一个DataGridViewButtonColumn对象,并设置相应的属性,如标题、按钮上显示的文本等,来实现按钮列的添加。

接下来,可以为DataGridView的CellClick事件添加事件处理程序。在事件处理程序中,可以判断点击的是按钮列,并执行相应的操作。可以通过判断点击的列索引和行索引来确定点击的是哪个按钮。然后,可以通过获取点击按钮所在行的数据,来进行相应的数据库操作。例如,可以通过row.Cells[columnIndex].Value来获取所需的数据,然后调用相应的数据库操作方法来插入、更新或删除数据。

在执行数据库操作之前,可能需要进行一些验证或确认操作,以确保数据的准确性和完整性。可以使用MessageBox或其他适当的方式来显示验证或确认提示,然后根据用户的选择来决定是否执行数据库操作。

通过在DataGridView中添加事件,并通过按钮来操作数据库,可以为用户提供一种方便和直观的界面,使用户能够快速进行数据库操作。这种方式可以提高用户的工作效率,同时也可以保证数据的准确性和完整性。

 private void dgvwProdCode_CellMouseClick(object sender, DataGridViewCellMouseEventArgs e)
        {
            if (e.ColumnIndex >= 0 && e.RowIndex >= 0)
            {
                Point curPosition = e.Location;//当前鼠标在当前单元格中的坐标
                if (this.dgvwProdCode.Columns[e.ColumnIndex].Name == "act")
                {
                    Graphics g = this.dgvwProdCode.CreateGraphics();
                    System.Drawing.Font myFont = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Underline, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
                    SizeF sizeDel = g.MeasureString("删除", myFont);
                    SizeF sizeMod = g.MeasureString("修改", myFont);
                    SizeF sizeIsEnable = g.MeasureString("启用/禁用", myFont);
                    float fDel = sizeDel.Width / (sizeDel.Width + sizeMod.Width + sizeIsEnable.Width);
                    float fMod = sizeMod.Width / (sizeDel.Width + sizeMod.Width + sizeIsEnable.Width);
                    float fIsEnable = sizeIsEnable.Width / (sizeDel.Width + sizeMod.Width + sizeIsEnable.Width);
                    Rectangle rectTotal = new Rectangle(0, 0, this.dgvwProdCode.Columns[e.ColumnIndex].Width, this.dgvwProdCode.Rows[e.RowIndex].Height);
                    RectangleF rectDel = new RectangleF(rectTotal.Left, rectTotal.Top, rectTotal.Width * fDel, rectTotal.Height);
                    RectangleF rectMod = new RectangleF(rectDel.Right, rectTotal.Top, rectTotal.Width * fMod, rectTotal.Height);
                    RectangleF rectIsEnable = new RectangleF(rectMod.Right, rectTotal.Top, rectTotal.Width * fIsEnable, rectTotal.Height);
                    //判断当前鼠标在哪个“按钮”范围内
                    if (rectDel.Contains(curPosition))//删除
                    {
                        IProduct product = new ProductImpl();
                        ProductInfoEntity productInfo = new ProductInfoEntity();
                        productInfo.recipe = dgvwProdCode.Rows[e.RowIndex].Cells[1].Value.ToString();
                        
                        if (product.Delete(productInfo) > 0)
                        {
                            this.dgvwProdCode.Rows.RemoveAt(e.RowIndex);
                            MessageBox.Show("删除成功");
                        }

                        dgvwProdCode.Refresh();//刷新显示
                    }
                    else if (rectMod.Contains(curPosition))//修改
                    {
                        // FormProductOperate formProductOperate = new FormProductOperate();
                        FormProductOperate formProductOperate = FormProductOperate.GetInstance();
                        formProductOperate.Text = "修改产品";
                        formProductOperate.btnAdd.Visible = false;
                        formProductOperate.btnConfirm.Visible = true;
                        formProductOperate.recipe = dgvwProdCode.Rows[dgvwProdCode.CurrentRow.Index].Cells[1].Value.ToString();
                        formProductOperate.Show();
                        dgvwProdCode.Refresh();//刷新显示
                    }
                    else if (rectIsEnable.Contains(curPosition))
                    {
                        IProduct product = new ProductImpl();
                        //获取选中产品记录产品id
                        string recipe = dgvwProdCode.Rows[dgvwProdCode.CurrentRow.Index].Cells[1].Value.ToString();
                        if (product.UpdateStatus(recipe) > 0)
                        {
                            UpDataViewSource();
                            MessageBox.Show("状态更改成功");
                        }

                    }
                        
                }
            }}

三、在按钮上鼠标箭头变成小手样式

使用CellMouseMove方法

private void dgvwProdCode_CellMouseMove(object sender, DataGridViewCellMouseEventArgs e)
        {
            if (e.ColumnIndex >= 0 && e.RowIndex >= 0)
            {
                Point curPosition = e.Location;//当前鼠标在当前单元格中的坐标
                if (this.dgvwProdCode.Columns[e.ColumnIndex].Name == "act")
                {
                    this.Cursor = Cursors.Hand;
                    //解决绘图时画面闪烁
                    SetStyle(ControlStyles.UserPaint, true);
                    SetStyle(ControlStyles.AllPaintingInWmPaint, true); // 禁止擦除背景.
                    SetStyle(ControlStyles.DoubleBuffer, true); // 双缓冲

                }
            }
        }

这样在DataGridView中完整的按钮和操作就完成。以及样式上的修改。

四、总结

在C#中,可以通过在DataGridView中添加按钮列,并在按钮的事件处理程序中操作数据。这是一种常见的实现方式,可以为用户提供方便的操作界面。

首先,在设计视图中,将一个DataGridView控件添加到窗体上。然后,在DataGridView的列集合中添加一个按钮列。这可以通过创建一个DataGridViewButtonColumn对象,并设置相应的属性来实现。例如,可以设置按钮列的标题、按钮上显示的文本以及按钮列的单元格都显示相同的文本。

接下来,需要处理按钮的点击事件。可以在DataGridView的CellClick事件中判断点击的是按钮列,并执行相应的操作。在事件处理程序中,可以通过判断点击的列索引和行索引来确定点击的是哪个按钮。然后,可以通过获取点击按钮所在行的数据,来进行相应的操作。例如,可以通过row.Cells[columnIndex].Value来获取对应列的值,然后执行相应的操作,如编辑数据、删除数据等。

最后,可以编写操作数据的方法。根据需要,可以在按钮的点击事件处理程序中调用相应的方法来操作数据。例如,可以弹出编辑窗口,让用户编辑数据,或者直接更新数据库中的数据。在操作数据的方法中,可以使用row.Cells[columnIndex].Value来获取所需的数据。

通过以上步骤,就可以在DataGridView中添加按钮,并在按钮的点击事件中操作数据。这样,用户就可以通过点击按钮来执行相应的操作,使界面更加直观和易用。你可以根据具体需求,进一步扩展按钮的功能和操作,以满足实际需求。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_45309155/article/details/129643493

智能推荐

Linux 用户权限_linux 授权-程序员宅基地

文章浏览阅读7.4k次,点赞12次,收藏27次。默认的ACL权限的作用是:如果个父目录设定了默认ACL权限,那么父目录中所有新建的子文件都会继承父目录的ACL权限。这个SUID只能运行在二进制的程序上(系统中的一些命令),不能用在脚本上,同样也不能放到目录上,放上也是无效的。设置了预设型ACL的目录,其下的所有文件或者子目录就都具有了主目录的ACL权限,并且子目录也同样有预设的ACl权限。任何用户都可以执行,而sudo是认用户名的,不是任何操作都可以执行的,更加精准。读 ——》命令:cat,vim,grep,head,tail,more,less等。_linux 授权

基于java+springboot+vue实现的医院门诊信息管理系统(文末源码+Lw+ppt)23-325-程序员宅基地

文章浏览阅读866次,点赞34次,收藏14次。系统根据现有的管理模块进行开发和扩展,采用面向对象的开发的思想和结构化的开发方法对医院门诊信息的现状进行系统调查。采用结构化的分析设计,该方法要求结合一定的图表,在模块化的基础上进行系统的开发工作。在设计中采用“自下而上”的思想,在医院门诊信息管理系统实现了用户信息、医生信息、医院门诊、预约订单、就诊信息、诊治信息、患者病历、药品信息等的功能性。关键词:医院门诊信息管理系统;

PCB设计敷铜时的天线效应_pcb中的线条形的底线会形成天线吗-程序员宅基地

文章浏览阅读9.6k次,点赞8次,收藏34次。关于PCB设计敷铜时的天线效应出于让PCB 焊接时尽可能不变形的目的,大部分PCB 生产厂家会要求PCB设计者在PCB 的空旷区域填充铜皮或者网格状的地线。但是我们的工程师对这个“填充”不敢轻易使用,也许是因为在PCB 调试中,曾经吃过“苦头”,也可能是专家们一直没有给出明确的结论。究竟敷铜是“利大于弊”还是“弊大于利”,本文用实测的角度来说明这个问题。下面的测量结_pcb中的线条形的底线会形成天线吗

用 nssm 把 Nginx 安装成 Windows 服务方法-程序员宅基地

文章浏览阅读295次。总之:用 nssm 比srvany.exe简便多了。1. 下载nginx windows版本:http://nginx.org/2. 下载nssm :http://nssm.cc/3. 安装Nginx下载解压到一个目录,nssm下载后解压相应版本(32/64)到一个目录。然后安装服务:nssm install N1"D:\N1\nginx.exe"即可安装成功最基本的服务,不过启动的是..._nssm nigx

H5新特性-程序员宅基地

文章浏览阅读1k次,点赞40次,收藏15次。【代码】H5新特性。

python正则表达式入门视频_Python快速入门正则表达式!半个小时就够了,最详细的教程系列!...-程序员宅基地

文章浏览阅读114次。正则表达式BeautifulSoupLxmlPyQueryCSSselector好了,开始我们的解析之旅吧!先用正则语法定义一个规则(pattern)然后用这个规则与你download的网页字符串进行对比,根据pattern提取你想要的数据。好了,让我们看看Python正则表达式的语法:re模块核心函数上面简单的介绍了正则表达式的pattern是如何设置的,那么下一步我们就可以开始我们的提取工作了..._python 正则 视频

随便推点

spark dataframe笔记 -- dataframe行转列_spark dataset<row> 行转列的方法-程序员宅基地

文章浏览阅读6k次。把dataframe一行内容变成多行。脚本:#!/usr/bin/python# -*- coding: utf-8 -*-"""@author:@contact:@time:"""from __future__ import print_functionfrom pyspark.sql import SparkSessionimport os, timefrom pysp..._spark dataset 行转列的方法

RaspberryPi4B 树莓派4B Linux5.4.y 内核编译_树莓派5.4内核系统镜像-程序员宅基地

文章浏览阅读2.7k次,点赞2次,收藏23次。1. 下载树莓派镜像1.1 树莓派官网下载最新版本,下载速度比较慢,1.2 从国内下载,如“完整版 2020-08-20-raspios-buster-armhf-full 树莓派最新系统镜”, 版本号5.4.51-v7l+$uname r5.4.51-v7l+2. 修改国内镜像源2.1 ssh连接到树莓派,修改sources.list , 修改第一行为中科大的软件源地址, 其中buster不要写为stretch, 否则会出现解决树莓派apt升级/安装提示依赖问题$ sudo nano /e_树莓派5.4内核系统镜像

技术面试问题汇总第004篇:猎豹移动反病毒工程师part4-程序员宅基地

文章浏览阅读3k次。这次所讨论的三个问题,比如DLL以及HOOK,很容易被病毒木马所利用,因此必须要比较全面地进行了解。而异常处理机制,则往往与漏洞相关联。它们自身的概念并不难理解,只是由之引申而来的问题,在计算机安全领域则是比较高级的技术,也是需要掌握的。尽管面试的时候,往往是理论性比较强,但是实际上最重要的还是动手能力。作为一名反病毒工程师(尽管我目前还不是),不单单要掌握恶意程序的编写技术,更需要清楚知道如何对付这些病毒木马。从这里也能够看出来,反病毒工程师的技术要求是比较高的,毕竟不单单要知道如何以正常手段使用计算机技

.NET ASP.NET全局文件Global.asax用法_全局文件global.asax中怎么使用using集-程序员宅基地

文章浏览阅读705次。ASP.NET全局文件Global.asax用法一、定义Global.asax 文件(也称为 ASP.NET 应用程序文件)是一个可选的文件,该文件包含响应 ASP.NET 或HTTP模块所引发的应用程序级别和会话级别事件的代码。Global.asax 文件驻留在 ASP.NET 应用程序的根目录中。运行时,分析 Global.asax 并将其编译到一个动态生成的 .NET Framework..._全局文件global.asax中怎么使用using集

centos yum安装 Could not open/read file:///etc/pki/rpm-gpg/RPM-GPG-KEY-puias-程序员宅基地

文章浏览阅读357次。一、在yum安装或者升级的过程中可能会遇到这个问题 Could not open/read file:///etc/pki/rpm-gpg/RPM-GPG-KEY-puias参看这个网页里面的(http://linuxsysconfig.com/2013/03/running-multiple-python-versions-on-cen..._yum localinstall can not load rpm file: /tmp/pkg.1378.rpm. could not open:/t

C - A Mist of Florescence-程序员宅基地

文章浏览阅读351次。C. A Mist of Florescencetime limit per test1 secondmemory limit per test256 megabytesinputstandard inputoutputstandard outputAs the boat drifts down the river, a wood full of blossoms shows u...