【博主推荐】C#的winfrom应用中datagridview常见问题及解决方案汇总

在这里插入图片描述

在这里插入图片描述

文章目录

  • 1.datagridview绘制出现鼠标悬浮数据变空白
  • 2.datagridview在每列前动态添加序号
    • 2.1 加载数据集完成后绘制序号
    • 2.2 RowPostPaint事件绘制
  • 3.datagridview改变行样式
  • 4.datagridview后台修改指定列数据
  • 5.datagridview固定某个列宽
  • 6.datagridview某个列的显示隐藏
  • 7.datagridview获取选中的值
  • 8.清空datagridview的几种方式
  • 9.datagridview单击双击事件
  • 10.datagridview获取编辑文本框
  • 11.datagridview绘制按钮
  • 万套模板,程序开发,在线开发,在线沟通
  • 优质资源分享

作者:xcLeigh
文章地址:https://blog.csdn.net/weixin_43151418/article/details/143602659


【博主推荐】C#的winfrom应用中datagridview常见问题及解决方案汇总,datagridview绘制出现鼠标悬浮数据变空白;datagridview在每列前动态添加序号;datagridview改变行样式;datagridview后台修改指定列数据;datagridview固定某个列宽;datagridview某个列的显示隐藏;datagridview获取选中的值;清空datagridview的几种方式;datagridview单击双击事件;datagridview绘制按钮;datagridview获取编辑文本框等datagridview常见问题及解决方案汇总。让你快速了解并使用datagridview。

注:dgvData为datagridview的name

1.datagridview绘制出现鼠标悬浮数据变空白

        加载完数据后,执行完成函数。

//修改单元格后执行这两个,避免窗体更新的数据不显示
dgvData.EndEdit();
dgvData.Refresh();

2.datagridview在每列前动态添加序号

在C#中,给DataGridView赋值并加上序号通常涉及到创建一个新的列来显示行号。这个新列不会存在于实体类中,而是在数据绑定之后动态添加。这样避免实体类或者数据填充时候发生冲突,导致程序崩溃。这里写的方法兼容所有的数据填充方法,欢迎提出讨论。

2.1 加载数据集完成后绘制序号

// 假设你有一个已经填充数据的DataGridView
dgvData.DataSource = GetData(); // 这是你的实体类方法,或者数据填充的方法,兼容任何填充姓氏

// 添加行号列
if (dgvData.Columns[0].HeaderText != "序号") { //避免重复添加
    DataGridViewTextBoxColumn rowNumberColumn = new DataGridViewTextBoxColumn();
    rowNumberColumn.HeaderText = "序号";
    rowNumberColumn.ValueType = typeof(int);
    rowNumberColumn.Name = "RowNumber";
    rowNumberColumn.ReadOnly = true; // 确保行号列不可编辑
    rowNumberColumn.AutoSizeMode = DataGridViewAutoSizeColumnMode.None;
    rowNumberColumn.Width= 80;
    // 添加行号列到DataGridView
    dgvData.Columns.Insert(0, rowNumberColumn); // 将其插入到第一列位置
}

2.2 RowPostPaint事件绘制

private void dgvData_RowPostPaint(object sender, DataGridViewRowPostPaintEventArgs e)
{
    // 获取DataGridView对象引用
    DataGridView dgv = sender as DataGridView;

    // 在单元格的内容上方绘制行号
    int rowIndex = e.RowIndex;
    SolidBrush brush = new SolidBrush(dgv.RowHeadersDefaultCellStyle.ForeColor);
    e.Graphics.DrawString((rowIndex + 1).ToString(), dgv.DefaultCellStyle.Font, brush, e.RowBounds.Location.X + 15, e.RowBounds.Location.Y + 4);
    brush.Dispose();
}

3.datagridview改变行样式

  • 可以根据自己的需求改自定义的文字颜色,背景颜色
 // 假设我们要改变第一列的文字颜色
 if (e.ColumnIndex == 1)// && e.Value != null
 {
     // 设置文字颜色为红色
     e.CellStyle.ForeColor = Color.Red;
     e.CellStyle.BackColor = Color.White;
 }

4.datagridview后台修改指定列数据

 // 确保指定的列存在
 if (dgvData.Columns["字段名"] != null)
 {
     // 设置指定行指定列的值
     dgvData.Rows[i].Cells["字段名"].Value = "新的值";
 }
 
 //修改单元格后执行这两个,避免窗体更新的数据不显示
 dgvData.EndEdit();
 dgvData.Refresh();

5.datagridview固定某个列宽

dgvData.DataSource = null; //填充前先置为空
// 填充数据
dgvData.DataSource = list;
dgvData.Columns[1].AutoSizeMode = DataGridViewAutoSizeColumnMode.None; //设置列宽大小自定义
dgvData.Columns[1].Width = 80; // 你想要设置的固定宽度

6.datagridview某个列的显示隐藏

//窗体初始化的时候配置
dgvData.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
dgvData.MultiSelect = true; // 允许多选
dgvData.EditMode = DataGridViewEditMode.EditOnEnter;

//赋值的时候设置
dgvData.Columns["Id"].HeaderText = "Id";
dgvData.Columns["name"].HeaderText = "名称";
dgvData.Columns[0].Visible = false; //隐藏某个列
dgvData.Columns[1].ReadOnly = true;//设置只读

7.datagridview获取选中的值

//窗体初始化配置,选择是选择整行,还是单个单元格
dgvData.SelectionMode = DataGridViewSelectionMode.FullRowSelect;

//数据处理时,获取选中数据
for (int i = 0; i < dgvData.SelectedRows.Count; i++)
{
   string xzz = dgvData.SelectedRows[i].Cells["字段名"].Value;
}

//设置选中值
// selectedRowIndex选中的索引
dgvData.Rows[selectedRowIndex].Selected = true;

8.清空datagridview的几种方式

  • 一行一行的清除
try
{
    while (this.dgv_log.Rows.Count != 0)
    {
        this.dgv_log.Rows.RemoveAt(0);
    }
}
catch (Exception)
{
}
  • 清空所有
dgvData.DataSource = null;
dgvData.Columns.Clear();
dgvData.Rows.Clear();

9.datagridview单击双击事件

在这里插入图片描述

  • 单击事件-CellClick
private void dgvData_CellClick(object sender, DataGridViewCellEventArgs e)
{
    // 确定点击的是否为行头(如果不关心可以去掉下面的判断)
    if (e.RowIndex >= 0 && !dgv_log.Rows[e.RowIndex].IsNewRow) // 确保点击的不是新行
    {
        // 点击的是数据行
        DataGridViewRow row = dgv_log.Rows[e.RowIndex];
        // 执行您需要的操作
        // 例如: MessageBox.Show("行点击: " + row.Cells[1].Value.ToString());
    }
}
  • 双击事件-CellDoubleClick
private void dgvData_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
{
    // 确定点击的是否为行头(如果不关心可以去掉下面的判断)
    if (e.RowIndex >= 0 && !dgv_log.Rows[e.RowIndex].IsNewRow) // 确保点击的不是新行
    {
        // 点击的是数据行
        DataGridViewRow row = dgv_log.Rows[e.RowIndex];
        // 执行您需要的操作
        // 例如: MessageBox.Show("行点击: " + row.Cells[1].Value.ToString());
    }
}

10.datagridview获取编辑文本框

  • 方式1,获取指定字段的值
	dgvData.Rows[这里是索引].Cells["实体字段""].Value  //获取选中的值
  • 方式2,获取选中的值
for (int i = 0; i < dgv_Data.SelectedRows.Count; i++)
{
	dgvData.SelectedRows[i].Cells["实体字段"].Value  //获取选中的值
}
  • 方式3,获取全部的值
for (int i = 0; i < dgv_Data.Rows.Count; i++) {
    dgvData.Rows[i].Cells["实体字段""].Value  //获取选中的值
}

11.datagridview绘制按钮

        datagridview绘制按钮,加CellPainting事件,绘制按钮,CellMouseClick事件,加入单击事件。

  • CellPainting事件
private void dgvData_CellPainting(object sender, DataGridViewCellPaintingEventArgs e)
{
        if (e.ColumnIndex >= 0 && e.RowIndex >= 0)
        {
            if (this.dgvData.Columns[e.ColumnIndex].Name == "要绘制按钮的实体字段")
            {
                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("按1", myFont);
                SizeF sizeMod = e.Graphics.MeasureString("按2", myFont);

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

                //设置每个“按钮的边界”
                RectangleF rectDel = new RectangleF(e.CellBounds.Left + 4, e.CellBounds.Top + 4, e.CellBounds.Width * fDel - 8, e.CellBounds.Height - 8);
                RectangleF rectMod = new RectangleF(rectDel.Right + 4, e.CellBounds.Top + 4, e.CellBounds.Width * fMod - 8, e.CellBounds.Height - 8);
                // 绘制边框
                using (Pen pen = new Pen(Color.OrangeRed))
                {
                    e.Graphics.DrawRectangle(pen, rectDel);
                }
                // 绘制边框
                using (Pen pen = new Pen(Color.OrangeRed))
                {
                    e.Graphics.DrawRectangle(pen, rectMod);
                }
                RectangleF rectDel1 = new RectangleF(e.CellBounds.Left, e.CellBounds.Top + 6, e.CellBounds.Width * fDel, e.CellBounds.Height - 6);
                RectangleF rectMod1 = new RectangleF(rectDel.Right, e.CellBounds.Top + 6, e.CellBounds.Width * fMod, e.CellBounds.Height - 6);
                e.Graphics.DrawString("按1", myFont, Brushes.Red, rectDel1, sf); //绘制“按钮”
                e.Graphics.DrawString("按2", myFont, Brushes.Green, rectMod1, sf);


                e.Handled = true;
            }
        }
}
  • CellMouseClick事件
private void dgvData_CellMouseClick(object sender, DataGridViewCellMouseEventArgs e)
{
        if (e.ColumnIndex >= 0 && e.RowIndex >= 0)
        {
            Point curPosition = e.Location;//当前鼠标在当前单元格中的坐标
            if (this.dgv_Data.Columns[e.ColumnIndex].Name == "Data_time")
            {
                Graphics g = this.dgv_Data.CreateGraphics();
                System.Drawing.Font myFont = new System.Drawing.Font("华文中宋", 9F, System.Drawing.FontStyle.Underline, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
                SizeF sizeDel = g.MeasureString("控1", myFont);
                SizeF sizeMod = g.MeasureString("控2", myFont);
                float fDel = sizeDel.Width / (sizeDel.Width + sizeMod.Width);
                float fMod = sizeMod.Width / (sizeDel.Width + sizeMod.Width);
                Rectangle rectTotal = new Rectangle(0, 0, this.dgv_Data.Columns[e.ColumnIndex].Width, this.dgv_Data.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);
                //判断当前鼠标在哪个“按钮”范围内
                if (rectDel.Contains(curPosition))//控1
                {
                    string str = dgv_Data.Rows[e.RowIndex].Cells[1].Value.ToString();
                    //UIMessageBox.Show(str);
                   
                        // 获取选中行的ID
                        if (dgv_Data.SelectedRows.Count > 0)
                        {
                            ShowWarningTip("执行操作!");
                        }
                        else
                        {
                            ShowWarningTip("没有选中操作数据!");
                        }
                }
                else if (rectMod.Contains(curPosition))//控2
                {
                    string str = dgvData.Rows[e.RowIndex].Cells[1].Value.ToString();
                    //UIMessageBox.Show(str);
                   // 获取选中行的ID
                        if (dgv_Data.SelectedRows.Count > 0)
                        {
                            ShowWarningTip("执行操作!");
                        }
                        else
                        {
                            ShowWarningTip("没有选中操作数据!");
                        }
                }
            }
        }
}
--------------- 业精于勤,荒于嬉 ---------------
 

请添加图片描述

--------------- 行成于思,毁于随 ---------------

万套模板,程序开发,在线开发,在线沟通

  • 专业后端大佬在线沟通需求开发
  • 专业前端大佬在线沟通需求开发
  • 专业网站整套大佬在线沟通需求开发
  • 专业毕业设计大佬在线沟通需求开发
  • 专业大作业大佬在线沟通需求开发
  • 【优惠活动】专属定制,程序在线开发

优质资源分享

🧡🧡🧡🧡🤍 【百篇源码模板】html5各行各业官网模板源码下载(1)

🧡🧡🧡🧡🤍 【模板源码】html实现酷炫美观的可视化大屏(十种风格示例,附源码)

🧡🧡🧡🤍🤍 【VUE系列】VUE3实现个人网站模板源码

🧡🧡🧡🤍🤍 【HTML源码】HTML5小游戏源码

🧡🧡🧡🧡🤍 【博主推荐】JAVA SSM框架的后台管理系统(附源码)

🧡🧡🧡🧡🤍 【博主推荐】SpringBoot API接口对数据库增删改查,路由,TOKEN,WebSocket完整版(附源码)

🧡🧡🧡🧡🤍 【博主推荐】HTML制作一个美观的个人简介网页(附源码)

🧡🧡🧡🧡🤍 【博主推荐】html好看的个人简历网页版(附源码)

🧡🧡🧡🧡🤍 【博主推荐】html好看的个人主页(附源码)

🧡🧡🧡🧡🤍 【博主推荐】html好看的邀请函(附源码)

🧡🧡🧡🧡🤍 【博主推荐】html好看的音乐播放器(附源码)

🧡🧡🧡🧡🤍 【博主推荐】html好看的拼图小游戏(附源码)

🧡🧡🧡🧡🧡 【博主推荐】html界面绘制SVG图形(附源码)

🧡🧡🧡🧡🤍 【博主推荐】html操作SVG图(附源码)

🧡🧡🧡🧡🤍 【博主推荐】html下拉框树形(附好看的登录界面)

🧡🧡🧡🧡🤍 【博主推荐】HTML5响应式手机WEB(附源码)

🧡🧡🧡🧡🤍 【博主推荐】大数据可视化大屏(源码下载)

🧡🧡🧡🧡🧡 【博主推荐】html引用百度地图定位闪烁弹框树形(附源码)

🧡🧡🧡🧡🤍 【博主推荐】HTML酷炫动画表白求爱界面(附源码)


在这里插入图片描述


     💞 关注博主 带你实现畅游前后端

     🏰 大屏可视化 带你体验酷炫大屏

     💯 神秘个人简介 带你体验不一样得介绍

     🎀 酷炫邀请函 带你体验高大上得邀请


     ① 🉑提供云服务部署(有自己的阿里云);
     ② 🉑提供前端、后端、应用程序、H5、小程序、公众号等相关业务;
     如🈶合作请联系我,期待您的联系。
    :本文撰写于CSDN平台,作者:xcLeigh所有权归作者所有) ,https://blog.csdn.net/weixin_43151418,如果相关下载没有跳转,请查看这个地址,相关链接没有跳转,皆是抄袭本文,转载请备注本文原地址。


     亲,码字不易,动动小手,欢迎 点赞 ➕ 收藏,如 🈶 问题请留言(评论),博主看见后一定及时给您答复,💌💌💌


原文地址:https://blog.csdn.net/weixin_43151418/article/details/143602659(防止抄袭,原文地址不可删除)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/923433.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【设计模式】创建型模式之单例模式(饿汉式 懒汉式 Golang实现)

定义 一个类只允许创建一个对象或实例&#xff0c;而且自行实例化并向整个系统提供该实例&#xff0c;这个类就是一个单例类&#xff0c;它提供全局访问的方法。这种设计模式叫单例设计模式&#xff0c;简称单例模式。 单例模式的要点&#xff1a; 某个类只能有一个实例必须…

Vivado程序固化到Flash

在上板调试FPGA时&#xff0c;通常使用JTAG接口下载程序到FPGA芯片中&#xff0c;FPGA本身是基于RAM工艺的器件&#xff0c;因此掉电后会丢失芯片内的程序&#xff0c;需要重新烧写程序。但是当程序需要投入使用时不能每一次都使用JTAG接口下载程序&#xff0c;一般FPGA的外围会…

技术文档,they are my collection!

工作 今天这篇文章&#xff0c;献给一直撰写技术文档的自己。我自认为是公司中最爱写文档的人了&#xff0c;我们是一个不到40人的小公司&#xff0c;公司作风没有多么严谨&#xff0c;领导也不会要求我们写技术文档。但是从入职初至今&#xff0c;我一直保持着写技术文档…

微信小程序学习指南从入门到精通

&#x1f5fd;微信小程序学习指南从入门到精通&#x1f5fd; &#x1f51d;微信小程序学习指南从入门到精通&#x1f51d;✍前言✍&#x1f4bb;微信小程序学习指南前言&#x1f4bb;一、&#x1f680;文章列表&#x1f680;二、&#x1f52f;教程文章的好处&#x1f52f;1. ✅…

JavaWeb——SpringBoot原理

10.1. 配置优先级 10.1.1. 配置文件 properties > yml(推荐) > yaml 10.1.2. Java系统属性、命令行参数 命令行参数 > Java系统属性 > 配置文件 10.2. Bean管理 10.2.1. 手动获取bean ApplicationContext&#xff0c;IOC容器对象 10.2.2. bean作用域 10.2.3.…

如何在Python中进行数学建模?

数学建模是数据科学中使用的强大工具&#xff0c;通过数学方程和算法来表示真实世界的系统和现象。Python拥有丰富的库生态系统&#xff0c;为开发和实现数学模型提供了一个很好的平台。本文将指导您完成Python中的数学建模过程&#xff0c;重点关注数据科学中的应用。 数学建…

OCR技术详解:从基础到应用

OCR技术详解&#xff1a;从基础到应用 引言 OCR技术的定义 OCR&#xff08;Optical Character Recognition&#xff0c;光学字符识别&#xff09;是一种将印刷或手写文本转换为机器可读文本的技术。通过OCR技术&#xff0c;计算机可以自动识别图像中的文字&#xff0c;并将其…

webrtc视频会议学习(三)

文章目录 关联&#xff1a;源码搭建coturn服务器nginx配置ice配置需服务器要开放的端口 效果 关联&#xff1a; webrtcP2P音视频通话&#xff08;一&#xff09; webrtcP2P音视频通话&#xff08;二&#xff09; webrtc视频会议学习&#xff08;三&#xff09; 源码 WebRTC…

【从零开始的LeetCode-算法】43. 网络延迟时间

有 n 个网络节点&#xff0c;标记为 1 到 n。 给你一个列表 times&#xff0c;表示信号经过 有向 边的传递时间。 times[i] (ui, vi, wi)&#xff0c;其中 ui 是源节点&#xff0c;vi 是目标节点&#xff0c; wi 是一个信号从源节点传递到目标节点的时间。 现在&#xff0c;…

数据结构--AVL树(平衡二叉树)

✅博客主页:爆打维c-CSDN博客​​​​​​ &#x1f43e; &#x1f539;分享c、c知识及代码 &#x1f43e; &#x1f539;Gitee代码仓库 五彩斑斓黑1 (colorful-black-1) - Gitee.com 一、AVL树是什么&#xff1f;&#xff08;含义、性质&#xff09; 1.AVL树的概念 AVL树是最…

sunshine和moonlight串流网络丢失帧高的问题(局域网)

注&#xff1a;此贴结果仅供参考 场景环境&#xff1a;单身公寓 路由器&#xff1a;2016年的路由器 开始&#xff1a;电脑安装sunshine软件&#xff0c;手机安装moonlight软件开始串流发现网络丢失帧发现巨高 一开始怀疑就是路由器问题&#xff0c;因为是局域网&#xff0c;而…

STM32F103外部中断配置

一、外部中断 在上一节我们介绍了STM32f103的嵌套向量中断控制器&#xff0c;其中包括中断的使能、失能、中断优先级分组以及中断优先级配置等内容。 1.1 外部中断/事件控制器 在STM32f103支持的60个可屏蔽中断中&#xff0c;有一些比较特殊的中断&#xff1a; 中断编号13 EXTI…

解决SSL VPN客户端一直提示无法连接服务器的问题

近期服务器更新VPN后&#xff0c;我的win10电脑一致无法连接到VPN服务器&#xff0c; SSL VPN客户端总是提示无法连接到服务端。网上百度尝试了各种方法后&#xff0c;终于通过以下设置方式解决了问题&#xff1a; 1、首先&#xff0c;在控制面板中打开“网络和共享中心”窗口&…

从零开始:Linux 环境下的 C/C++ 编译教程

个人主页&#xff1a;chian-ocean 文章专栏 前言&#xff1a; GCC&#xff08;GNU Compiler Collection&#xff09;是一个功能强大的编译器集合&#xff0c;支持多种语言&#xff0c;包括 C 和 C。其中 gcc 用于 C 语言编译&#xff0c;g 专用于 C 编译。 Linux GCC or G的安…

小程序-基于java+SpringBoot+Vue的网上花店微信小程序设计与实现

项目运行 1.运行环境&#xff1a;最好是java jdk 1.8&#xff0c;我们在这个平台上运行的。其他版本理论上也可以。 2.IDE环境&#xff1a;IDEA&#xff0c;Eclipse,Myeclipse都可以。推荐IDEA; 3.tomcat环境&#xff1a;Tomcat 7.x,8.x,9.x版本均可 4.硬件环境&#xff1a…

Transformer:一种革命性的序列到序列学习框架

目录 ​编辑 引言 Transformer模型的基本结构 1. 自注意力机制 2. 前馈神经网络 3. 位置编码 Transformer的工作原理 Transformer的应用 机器翻译 文本摘要 问答系统 文本分类 语音识别 图像识别 结论 引言 Transformer模型&#xff0c;自2017年由Vaswani等人提…

轮转数组(java)

题目描述 给定一个整数数组 nums&#xff0c;将数组中的元素向右轮转 k 个位置&#xff0c;其中 k 是非负数 示例 1: 输入: nums [1,2,3,4,5,6,7], k 3 输出: [5,6,7,1,2,3,4] 解释: 向右轮转 1 步: [7,1,2,3,4,5,6] 向右轮转 2 步: [6,7,1,2,3,4,5] 向右轮转 3 步: [5,6,7,…

【vue3实现微信小程序】每日专题与分页跳转的初步实现

快速跳转&#xff1a; 我的个人博客主页&#x1f449;&#xff1a;Reuuse博客 新开专栏&#x1f449;&#xff1a;Vue3专栏 参考文献&#x1f449;&#xff1a;uniapp官网 免费图标&#x1f449;&#xff1a;阿里巴巴矢量图标库 ❀ 感谢支持&#xff01;☀ 前情提要 &#x…

【优先算法学习】双指针--结合题目讲解学习

目录 1.有效三角形的个数 1.2题目解题思路 1.3代码实现 2.和为s的两个数 2.1刷题链接-> 2.2题目解题思路 2.3代码实现 1.有效三角形的个数 1.1刷题链接-> 力扣-有效三角形的个数https://leetcode.cn/problems/valid-triangle-number/description/ 1.2题目解…

云服务器部署WebSocket项目

WebSocket是一种在单个TCP连接上进行全双工通信的协议&#xff0c;其设计的目的是在Web浏览器和Web服务器之间进行实时通信&#xff08;实时Web&#xff09; WebSocket协议的优点包括&#xff1a; 1. 更高效的网络利用率&#xff1a;与HTTP相比&#xff0c;WebSocket的握手只…