当前位置: 首页 > article >正文

【博主推荐】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(防止抄袭,原文地址不可删除)


http://www.kler.cn/a/411147.html

相关文章:

  • 渗透测试笔记—shodan(7完结)
  • QT QToolButton控件 全面详解
  • 3174、清除数字
  • 【设计模式】【行为型模式(Behavioral Patterns)】之状态模式(State Pattern)
  • 「Mac玩转仓颉内测版25」基础篇5 - 布尔类型详解
  • 网络层协议IP
  • Qt SQL模块概述
  • 【数据结构实战篇】用C语言实现你的私有队列
  • SpringBoot使用MySQL数据库,配置alibaba druid数据库连接池
  • 力扣 73. 矩阵置零
  • 【vue3实现微信小程序】每日专题与分页跳转的初步实现
  • 微服务篇-深入了解使用 RestTemplate 远程调用、Nacos 注册中心基本原理与使用、OpenFeign 的基本使用
  • 【Unity3D】创建自定义字体
  • C语言实例之9斐波那契数列实现
  • 图论入门编程
  • 安装 IntelliJ IDEA
  • 深度学习模型:循环神经网络(RNN)
  • 极狐GitLab 17.6 正式发布几十项与 DevSecOps 相关的功能【五】
  • Error: Invalid version flag: if 问题排查
  • 【DFS】个人练习-Leetcode-646. Maximum Length of Pair Chain
  • jvm核心组件介绍
  • 手搓人工智能—聚类分析(下)谱系聚类与K-mean聚类
  • E2、UML类图顺序图状态图实训
  • 计算机网络的功能
  • 银行卡 OCR 识别 API 接口的发展前景
  • 解决 java -jar 报错:xxx.jar 中没有主清单属性