【博主推荐】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;// 添加行号列到DataGridViewdgvData.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);// 获取选中行的IDif (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);// 获取选中行的IDif (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(防止抄袭,原文地址不可删除)

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

宠物领养平台构建:SpringBoot技术路线图

摘 要 如今社会上各行各业&#xff0c;都在用属于自己专用的软件来进行工作&#xff0c;互联网发展到这个时候&#xff0c;人们已经发现离不开了互联网。互联网的发展&#xff0c;离不开一些新的技术&#xff0c;而新技术的产生往往是为了解决现有问题而产生的。针对于宠物领养…

使用经典的Java,还是拥抱新兴的Rust?

在当代互联网时代的企业级开发中&#xff0c;技术栈的选择往往牵动着每个团队的神经。随着Rust语言的崛起&#xff0c;许多开发团队开始重新思考&#xff1a;是继续坚持使用经典的Java&#xff0c;还是拥抱新兴的Rust&#xff1f;这个问题背后&#xff0c;折射出的是对技术演进…

springboot学习-jdbc,jdbc-client,spring-data-jdbc

晚上又看了Dan Vega的视频&#xff0c;讲解了jdbc在spring 的发展史。 jdbc: sql语句&#xff0c;手工梳理result&#xff0c;并循环。最原始的JAVA API&#xff0c;从1998年JAVA1.0就有了。jdbc template: sql语句&#xff0c;手工处理result ,不用循环了。--从spring诞生就有…

卸载snap docker一直卡住:Save data of snap “docker“ in automatic snapshot set #3

在卸载 Snap 安装的 Docker 时卡住&#xff0c;通常是因为 Snap 在执行卸载时会先尝试保存一些快照&#xff08;自动或手动创建的&#xff09;&#xff0c;并且该过程可能因某些原因而卡住。为了解决这个问题&#xff0c;你可以按照以下步骤强制删除 Snap 安装的 Docker&#x…

Java项目运行报错“java: -source 1.5 中不支持 diamond 运算符“解决办法windows/linux系统踩坑实录

文章目录 一、问题描述二、解决方案 一、问题描述 在接手同事的Java项目时&#xff0c;依赖和打包都能正常操作&#xff0c;但一点击运行项目&#xff0c;就会报错&#xff1a; java: -source 1.5 中不支持 diamond 运算符 (请使用 -source 7 或更高版本以启用 diamond 运算符…

SQL基础入门 —— SQL概述

目录 1. 什么是SQL及其应用场景 SQL的应用场景 2. SQL数据库与NoSQL数据库的区别 2.1 数据模型 2.2 查询语言 2.3 扩展性 2.4 一致性与事务 2.5 使用场景 2.6 性能与扩展性 总结 3. 常见的SQL数据库管理系统&#xff08;MySQL, PostgreSQL, SQLite等&#xff09; 3.…

开源项目:纯Python构建的中后台管理系统

来源&#xff1a;Python大数据分析 费弗里 大家好我是费老师&#xff0c;目前市面上有很多开源的「中后台管理系统」解决方案&#xff0c;复杂如「若依」那种前端基于Vue&#xff0c;后端基于Java的框架&#xff0c;虽然其提供了较为完善的一整套前后端分离权限管理系统解决方…

视频video鼠标移入移除展示隐藏(自定义控件)

效果图 代码 <template><div class"video-container" mouseover"showControls" mouseleave"hideControlsAfterDelay"><videoref"video"loadedmetadata"initializePlayer"timeupdate"updateProgress&qu…

【连接池】.NET开源 ORM 框架 SqlSugar 系列

.NET开源 ORM 框架 SqlSugar 系列 【开篇】.NET开源 ORM 框架 SqlSugar 系列【入门必看】.NET开源 ORM 框架 SqlSugar 系列【实体配置】.NET开源 ORM 框架 SqlSugar 系列【Db First】.NET开源 ORM 框架 SqlSugar 系列【Code First】.NET开源 ORM 框架 SqlSugar 系列【数据事务…

ubuntu24.04安装Kubernetes1.31.0(k8s1.30.0)高可用集群

ubuntu24.04安装Kubernetes1.30.0(kubernetes1.30.0)高可用集群 一、总体概览 目前最新版的K8S版本应该是1.31.0,我们安装的是第二新的版本1.30.0,因为有大神XiaoHH Superme指路,所以基本上没踩坑,很顺利就搭建完成了。所有的机器都采用的最新版Ubuntu-Server-24.04长期支…

Ubuntu中的apt update 和 apt upgrade

apt update 和 apt upgrade 是 Debian 及其衍生发行版&#xff08;如 Ubuntu&#xff09;中常用的两个 APT 包管理命令&#xff0c;它们各自执行不同的任务&#xff1a; apt update: 这个命令用于更新本地软件包列表。当你运行 apt update 时&#xff0c;APT 会从配置的源&…

鸿蒙HarmonyOS vs Android系统对比

鸿蒙系统 (HarmonyOS) vs Android 系统对比 鸿蒙操作系统&#xff08;HarmonyOS&#xff09;是华为推出的多终端操作系统&#xff0c;旨在构建一个 跨设备、跨平台、智能化 的生态系统。与 Android 系统相比&#xff0c;鸿蒙有其独特的设计理念和技术架构。以下是它们在多个关…

Hbase 部署

HBase是一个分布式的、面向列的开源数据库&#xff0c;它是Apache Hadoop项目的子项目。为了成功部署HBase&#xff0c;可以按照以下步骤进行&#xff1a; 主机部署 一、准备环节 设备基本要求&#xff1a; Hadoop和ZooKeeper&#xff1a;HBase集群需要依赖Hadoop和Zookeepe…

微软要求 Windows Insider 用户试用备受争议的召回功能

拥有搭载 Qualcomm Snapdragon 处理器的 Copilot PC 的 Windows Insider 计划参与者现在可以试用 Recall&#xff0c;这是一项臭名昭著的快照拍摄 AI 功能&#xff0c;在今年早些时候推出时受到了很多批评。 Windows 营销高级总监 Melissa Grant 上周表示&#xff1a;“我们听…

脉冲动画效果

js实现脉冲动画效果&#xff1a; 鼠标点击时&#xff0c;添加动画类&#xff0c;进而实现动画效果&#xff0c;鼠标离开时&#xff0c;移除动画类&#xff0c;回归静态图效果。 <!DOCTYPE html> <html lang"en"> <head><meta charset"UT…

Linux—进程学习—04(进程地址空间学习)

目录 Linux—进程学习—41.程序地址空间1.1虚拟地址空间的现象1.2虚拟地址空间的理解(感性) 2.进程地址空间2.0 mm_struct结构体2.1 mm_struct结构体的源代码2.2分页&虚拟地址空间解释前面的实验现象 2.3进程地址空间存在的原因2.3.1第一个原因2.3.2第二个原因2.3.3第三个原…

Java集成Sa-Token进行认证与授权

引言 软件开发过程中都必须要有的一个功能&#xff0c;那就是认证与授权&#xff0c;经过大佬们的不断更新迭代&#xff0c;使得如今实现认证与授权功能变得相对简单&#xff0c;也许你并不能真正的接触到认证与授权这一功能&#xff0c;除非你接触的项目是从0到1的&#xff0c…

uni-app获取到的数据如何保留两位小数

<view><text class"daily_r">{{ (chartD.selfPowerCount || 0).toFixed(2) }}</text>度</view> 1&#xff0c;在模板中&#xff0c;所有需要保留两位小数的数值都使用了 toFixed(2) 方法&#xff0c;例如 {{ (chartD.selfPowerCount || 0).…

图论入门编程

卡码网刷题链接&#xff1a;98. 所有可达路径 一、题目简述 二、编程demo 方法①邻接矩阵 from collections import defaultdict #简历邻接矩阵 def build_graph(): n, m map(int,input().split()) graph [[0 for _ in range(n1)] for _ in range(n1)]for _ in range(m): …

09. 字典

一、什么是字典 在 Python 中&#xff0c;字典&#xff08;dictionary&#xff09;是一系列 键值对。每个键都与一个值关联&#xff0c;可以使用键来访问与之关联的值。字典中的 元键 只能是 不可变类型 的数据类型&#xff0c;也就是 可哈希类型。与键相关的值可以是数字、字符…