C#中的DataGridView中添加按钮并操作数据

2023-11-18

目录

背景

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C#中的DataGridView中添加按钮并操作数据 的相关文章

随机推荐

  • 802.11协议数据帧详解(一)——802.11帧结构与分类

    今天继续给大家介绍WLAN 本文主要内容是802 11帧格式 一 802 11数据帧整体结构 IEEE802 11系列标准定义了WLAN无线网络数据帧的帧结构 和基本的物理层 MAC层通信标准 与802 3定义的以太网数据帧格式及通信方式不
  • C++之继承<inheritance>

    目录 前言 继承 1 继承的概念与定义 1 1 继承的概念 1 2 继承的定义 2 基类和派生类对象赋值转换 3 继承中的作用域 4 派生类的默认成员函数 5 继承与友元 6 继承与静态成员 7 复杂的菱形继承及菱形虚拟继承 8 继承的总结
  • 前端响应式布局原理与实践

    前言 作为一个前端开发者 响应式网站开发是必备技能之一 响应式有它的很好的优点 也有它一定的缺点 这就需要我们在开发的时候做出取舍 对于内容较少 主要为展示类网站 故采用响应式 对于内容多 管理类的网站采用分开开发的方式 不同设备采用不同的
  • Ubuntu 16.04 设置pycharm 2018版本的 桌面快捷启动方式

    在ubuntu环境中每次使用pycharm需要到它的安装目录中执行 pycharm sh来启动pycharm 比较麻烦 那么如何设置快捷方式呢 首先Ubuntu下所有的快捷方式都在 usr share applications 解压 这里我
  • Dubbo启动错误

    加完Nacos配置后报错 信息 DUBBO The registry
  • 第十七篇:Unity/UE4如何实现Cave空间(一)

    首先什么叫CAVE空间 CAVE是围绕着观察者具有多个图像画面的虚拟现实系统 多个投影面组成一个虚拟空间 理论上CAVE是基于计算机图形学把高分辨率的立体投影技术和三维计算机图形技术 音响技术 传感器技术等综合在一起 产生一个供多人使用的完
  • css改变svg颜色_如何使用CSS混合模式和SVG动态更改产品图像的颜色

    css改变svg颜色 To better explain that title right off the bat here s what we re about to learn and it s easier than you thin
  • 《算法设计与分析》学习笔记

    目录 算法基本概念 算法的定义 算法复杂度分析 渐近记号 渐近上界记号O 渐近下界记号 渐近紧确界记号 非渐近紧确上界记号o 非渐近紧确下界记号 渐进记号极限定义 分治 分治步骤 递归树 编辑代入法 主方法 改变变量 二叉树 堆 建堆 堆排
  • C语言 基础知识之static(static是什么,static的好处,static的使用和作用)

    一 static是什么 static是C C 中的修饰符 可以用来修饰变量 也可以用来修饰函数 二 static的好处是什么 1 隐藏变量或函数 隔离错误 有利于模块化程序 在编程中 难免会用到全局变量 全局变量的作用域是整个源程序 当一个
  • virtualbox虚拟机安装Ubuntu异常处理:FATAL: NO bootable medium found! System halted

    遇到的问题 当virtualbox虚拟机安装linux系统 异常处理 FATAL NO bootable medium found System halted 问题的原因 没有找到iso文件来安装系统 解决的方案 下载镜像文件 centos
  • InnoDB Rollback Segment & Undo Page Deallocation实现源码分析

    InnoDB Rollback Segment Undo Page Deallocation实现源码分析 4月 23rd 2012 发表评论 Trackback 1 InnoDB Rollback Segment 1 1 1 Rollbac
  • 计算机视觉人脸检测与识别

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 TOC 文章目录 使用opencv进行人脸检测 文件目录 二 init文件内容 shishi文件内容 coding utf 8 加载训练数据集文件 准备识别的图片
  • 基于微信小程序的短视频管理系统

    末尾获取源码 开发语言 Java Java开发工具 JDK1 8 后端框架 SSM 前端框架 VUE 数据库 MySQL5 7 服务器 Tomcat8 5 开发软件 IDEA Eclipse 是否Maven项目 是 目录 一 项目简介 二
  • NEZUKO: 1——202201152003

    NEZUKO 1 202201152003 About Release Back to the Top Name nezuko 1 Date release 21 Aug 2019 Author yunaranyancat Series n
  • 五一假期出行的数据爬取和分析

    出来旅行 用手机编辑的 代码格式有可能出现问题 等回去用电脑进行修改 你们的萧萧吖 随着旅游业的迅速发展 越来越多的人选择在假期去旅游 五一假期是国内最热门的旅游季节之一 吸引了大量的游客前往各个景点 本篇博客将介绍如何使用 Python
  • XXE漏洞原理

    XXE漏洞是XML外部实体注入漏洞 那什么是外部实体呢 XML DTD 1 文档类型定义 DTD 可定义合法的XML文档构建模块 它使用一系列合法的元素来定义文档的结构 2 DTD 可被成行地声明于 XML 文档中 也可作为一个外部引用 P
  • 机器学习基础 第三章 分类算法

    1 线性分类器 感知器 1 1 感知器 有如图1 1所示的两类数据希望找到 如果想把他们分开 最简单的方法就是用图中的绿线将它们分开 显然绿线的方程为 t 0 1x 1y 1 1 1 t omega 0 omega 1 x omega 1
  • Linux的缓存内存(cache memory)

    PS 为什么Linux系统没运行多少程序 显示的可用内存这么少 其实Linux与Win的内存管理不同 会尽量缓存内存以提高读写性能 通常叫做Cache Memory 为什么Linux系统没运行多少程序 显示的可用内存这么少 其实Linux与
  • PyTorch模型训练集正常收敛,但验证集准确率稳定在10%并保持不变

    问题描述 训练过程中遇到的一个Bug 可能是跟Torch本身有关 如下图和题目所示 经过多轮训练 训练准确率开始收敛 但是验证准确率保持在10 左右不变 排查手册 一般来说这表示模型本身可能存在问题 下面列出一个排查手册 检查是否是数据问题
  • C#中的DataGridView中添加按钮并操作数据

    目录 背景 一 在DataGridView中显示需要的按钮 二 给DataGridView添加事件 可以通过按钮来操作数据库 三 在按钮上鼠标箭头变成小手样式 四 总结 背景 最近在项目中有需求需要在DataGridView中添加 删除 修