【博主推荐】C#的winfrom应用中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实现酷炫美观的可视化大屏(十种风格示例,附源码)
🧡🧡🧡🧡🤍 【博主推荐】JAVA SSM框架的后台管理系统(附源码)
🧡🧡🧡🧡🤍 【博主推荐】SpringBoot API接口对数据库增删改查,路由,TOKEN,WebSocket完整版(附源码)
🧡🧡🧡🧡🤍 【博主推荐】HTML制作一个美观的个人简介网页(附源码)
🧡🧡🧡🧡🤍 【博主推荐】html好看的个人简历网页版(附源码)
🧡🧡🧡🧡🧡 【博主推荐】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(防止抄袭,原文地址不可删除)
原文地址:https://blog.csdn.net/weixin_43151418/article/details/143602659
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!