C#Winform的DataGridView控件使用详解2—DataGridView表格样式设置及表格操作

article/2025/11/1 5:19:59

C#Winform的DataGridView控件使用详解2—DataGridView表格样式设置及表格操作

  • DataGridView表格样式设置
    • DataGridView行序号设置
  • 右键弹出控件表格操作
    • DataGridView新建行
    • DataGridView删除行
    • DataGridView清除内容
    • DataGridView复制
    • DataGridView粘贴

在展示和处理二维数据时,我们常常会想起Excel。但是使用Excel自带的各种函数处理较为繁琐的步骤时显得略显吃力,如果使用Excel自带宏编程,可能会对VB语言不甚熟悉或是感觉不nice。这个时候,熟悉C#编程语言的你,就需要用到DataGridView控件,设计一款二维数据处理利器。 此处,我们开始进入对DataGridView摸索学习的环节…

在上一章内容《C#Winform的DataGridView控件使用详解1-七种DataGridViewColumn类型使用方法》中,我们介绍了6种DataGridView列对象,在本章内容部中,我们将详细介绍DataGridViewTextBoxColumn对象的Cell设置(表头、表格内容、行序号)、右键弹出行操作(新建行、删除行、清空内容、复制、粘贴)。

DataGridView表格样式设置

DataGridView的表格样式包括表头(ColumnHeadersDefaultCellStyle)和表格内容(RowsDefaultCellStyle)的样式,此处我们对其的字体对齐方式点击自动排序宽度可调节来进行设置:
1、字体与对齐方式设置

// 设置表头居中,其对齐方式一共有10种,包含竖向的顶中底和水平的左中右以及NotSet
this.dtLineHCurvePara.ColumnHeadersDefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
//设置表头字体样式
this.dtLineHCurvePara.ColumnHeadersDefaultCellStyle.Font = new Font("宋体", 11);
//设置单元格cell内容居中
this.dtLineHCurvePara.RowsDefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
//设置单元格cell字体样式
this.dtLineHCurvePara.RowsDefaultCellStyle.Font = new Font("宋体", 

设置各种居中和字体样式后,结果如下显示:
在这里插入图片描述
2、对齐与表格排序的相互影响
但是当我们设置了表头和单元格均居中后,但发现表头并没有出现居中效果,如下图:
在这里插入图片描述这里,我们需要调整一下表格列的参数,将排序模式设置为无排序:

在这里插入图片描述
设置了表头居中并没有显示居中效果的原因在于,该列排序模式为自动排序,所有该表头位置会出现一个便于排序点击的倒三角,会占据表头位置。
在这里插入图片描述
3、表格宽度调节
Excel表格的行高和列宽都能手动拉,为了满足一定的需求,我们需要设置是否可以调整行列尺寸(False:不能手动调整,True:可手动调整)。
在这里插入图片描述

DataGridView行序号设置

我们直接使用并填充数据的DataGridView默认是没有行号的,这里我们要利用表格的RowPostPaint函数,对表格进行重绘:

#region 显示行号
private void dtLineHCurvePara_RowPostPaint(object sender, DataGridViewRowPostPaintEventArgs e)
{var grid = sender as DataGridView;var rowidx = (e.RowIndex + 1).ToString();var centerFormat = new StringFormat(){Alignment = StringAlignment.Center,LineAlignment = StringAlignment.Center};var headerBuunds = new 	System.Drawing.Rectangle(e.RowBounds.Left, e.RowBounds.Top, grid.RowHeadersWidth, e.RowBounds.Height);e.Graphics.DrawString(rowidx, new Font("宋体", 11), SystemBrushes.ControlText, headerBuunds, centerFormat);
}
#endregion

对表格进行重绘后,表格每添加一行,均会显示每行的行号,行号的字体也可以在代码中设置,表现如下:
在这里插入图片描述

右键弹出控件表格操作

为实现表格的会操作,给DataGridView绑定contextMenuStrip控件,然后在右键弹出菜单里面添加新建行删除行清除选中内容复制粘贴操作
首先在软件界面登录的时候,将表格与右键弹出框绑定。

#region 编辑平曲线界面的Load事件
private void sFrmLineHCurveParaEdit_Load(object sender, EventArgs e)
{this.dtLineHCurvePara.ContextMenuStrip = this.contextMenuStrip1;
}

在这里插入图片描述

DataGridView新建行

右键弹出框,点击【新建行】按钮,即可在表格最后新增一行

#region 新建行
private void btnNewRow_Click(object sender, EventArgs e)
{this.dtLineHCurvePara.Rows.Add();
}
#endregion

DataGridView删除行

右键弹出框,点击【删除行】按钮,即可删除指定行号的行,如果要删除选中行,需要循环遍历DataGridView的SelectedRows对象,获取选中行的行序号,删除即可。

#region 删除行
private void btnDeleteRow_Click(object sender, EventArgs e)
{int RowIndex = 1;//需要删除行的行序号this.dtLineHCurvePara.Rows.RemoveAt(RowIndex);
}
#endregion

DataGridView清除内容

右键弹出框,点击【清除】按钮,即可将选中单元格的内容清空

#region 清除选中内容
private void btnClear_Click(object sender, EventArgs e)
{//根据选中的datagridview单元格,对其内容赋值为""int cellsCount = this.dtLineHCurvePara.SelectedCells.Count; //选中的单元格数量for (int i = 0; i < cellsCount; i++)//循环选中的单元格{dtLineHCurvePara.SelectedCells[i].Value = "";}
}
#endregion

DataGridView复制

右键弹出框,点击【复制】按钮,即可将选中表格内容按照一定格式写入电脑剪切板,后续可直接在Excel表中粘贴即可,会保留一样的数据格式。

#region 复制选中的单元格内容
private void btnCopy_Click(object sender, EventArgs e)
{try{Clipboard.SetText(this.dtLineHCurvePara.GetClipboardContent().GetData(DataFormats.Text).ToString());}catch{}
}
#endregion

DataGridView粘贴

右键弹出框,点击【粘贴】按钮,即可将剪切板上的内容按照格式依序粘贴到DataGridView的单元格内。它可以自动判断需要的行,然后行自增,可以判断需要的列。列数不够会弹出提示。可以实现直接将Excel表格内容粘贴进来。

#region 粘贴剪切板内表格内容到DataGridView
private void btnPaste_Click(object sender, EventArgs e)
{try{string clipboardText = Clipboard.GetText(); //获取剪贴板中的内容if (string.IsNullOrEmpty(clipboardText))//检测是否为空{return;}int colnum = 0;  //获取剪切板列数量int rownum = 0;  //获取剪切板行数量for (int i = 0; i < clipboardText.Length; i++){if (clipboardText.Substring(i, 1) == "\t") //每列{colnum++;}if (clipboardText.Substring(i, 1) == "\n")  //每行{rownum++;}}//粘贴板上的数据来源于EXCEL时,每行末尾都有\n,来源于DataGridView是,最后一行末尾没有\nif (clipboardText.Substring(clipboardText.Length - 1, 1) == "\n")  //剪切板最后一位{rownum--;}//此时,行数列数均比真实行列内容对象少1colnum = colnum / (rownum + 1);  //?????object[,] data; //定义object类型的二维数组data = new object[rownum + 1, colnum + 1];  //根据剪贴板的行列数实例化数组//根据创建的data数组的行列数,检测是否当前datagridview行数大于等于data数组行数,少于则新建行while (rownum > this.dtLineHCurvePara.RowCount - this.dtLineHCurvePara.SelectedCells[this.dtLineHCurvePara.SelectedCells.Count - 1].RowIndex - 1) //每次创建五行,直到数量足够{for (int i = 0; i < 5; i++){this.dtLineHCurvePara.Rows.Add();}}// 检查剪切板内的列是否多于datagridview2内的列if ((colnum + 1) > this.dtLineHCurvePara.ColumnCount){MessageBox.Show("复制列数大于当前表格列数\n,请重新复制!");return;}string rowStr = "";//对数组各元素赋值for (int i = 0; i <= rownum; i++){for (int j = 0; j <= colnum; j++){//一行中的其它列if (j != colnum){rowStr = clipboardText.Substring(0, clipboardText.IndexOf("\t"));clipboardText = clipboardText.Substring(clipboardText.IndexOf("\t") + 1); //将前面使用过的部分裁剪}//一行中的最后一列(最后一个不为\r)if (j == colnum && clipboardText.IndexOf("\r") != -1){rowStr = clipboardText.Substring(0, clipboardText.IndexOf("\r"));}//最后一行的最后一列(最后一个为\r)if (j == colnum && clipboardText.IndexOf("\r") == -1){rowStr = clipboardText.Substring(0);}data[i, j] = rowStr;}//截取下一行及以后的数据clipboardText = clipboardText.Substring(clipboardText.IndexOf("\n") + 1);}clipboardText = Clipboard.GetText();int cellsCount = this.dtLineHCurvePara.SelectedCells.Count; //选中的单元格数量int r1 = (this.dtLineHCurvePara.SelectedCells[cellsCount - 1].RowIndex); //选中的第一个的行下标int r2 = (this.dtLineHCurvePara.SelectedCells[0].RowIndex); //选中最后一个的行下标int c1 = (this.dtLineHCurvePara.SelectedCells[cellsCount - 1].ColumnIndex); //选中的第一个的列下标int c2 = (this.dtLineHCurvePara.SelectedCells[0].ColumnIndex); //选中的最后一个的列下表int rowIndex = Math.Abs(r2 - r1) + 1; //选中单元格的行数量int colIndex = Math.Abs(c2 - c1) + 1; //选中但换个的列数量if (colIndex != colnum + 1 || rowIndex != rownum + 1) //选中的行列数量与剪切板内的行列数量不一致{//如果区域不一致,选取选中的第一格单元格作为锚点for (int i = 0; i <= rownum; i++) //遍历行{for (int j = 0; j <= colnum; j++) //遍历列{this.dtLineHCurvePara.Rows[i + r1].Cells[j + c1].Value = data[i, j];}}}else{for (int i = 0; i <= rownum; i++) //遍历行{for (int j = 0; j <= colnum; j++) //遍历列{this.dtLineHCurvePara.Rows[i + r1].Cells[j + c1].Value = data[i, j];}}}}catch { }}
#endregion

http://chatgpt.dhexx.cn/article/YCp0WerP.shtml

相关文章

C# DataGridView控件的基础应用实例

目录 引言一、界面简介二、初始化三、添加一行数据四、允许修改表格五、复制选择的数据六、复制所有数据七、读一行数据八、读所有数据九、查找名字记录十、删除一行数据十一、删除多行数据十二、清除所有行十三、删除所有列十四、其它&#xff1a;选中单元格十五、最后 引言 …

基于用户的协同过滤个性化音乐推荐系统毕业设计

基于用户的协同过滤个性化音乐推荐系统 摘 要 互联网发展到如今已经完完全全的改变了的生活方式&#xff0c;融入了日常生活&#xff0c;包括交流&#xff0c;出行&#xff0c;消费&#xff0c;娱乐等。与此同时&#xff0c;音乐数据也在与日俱增的变化着。用户在访问一个…

基于深度学习的音乐推荐系统

♚ 作者&#xff1a;沂水寒城&#xff0c;CSDN博客专家&#xff0c;个人研究方向&#xff1a;机器学习、深度学习、NLP、CV Blog: http://yishuihancheng.blog.csdn.net 推荐系统在我们日常生活中发挥着非常重要的作用&#xff0c;相信实际从事过推荐相关的工程项目的人或多或少…

(附源码)计算机毕业设计SSM基于java的音乐推荐系统

&#xff08;附源码&#xff09;计算机毕业设计SSM基于java的音乐推荐系统 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技…

【计算机毕业设计】Java基于协同过滤算法的音乐推荐系统

毕设帮助、开题指导、源码交流&#xff0c;联系方式见文末。。 音乐检索系统的开发目的是使音乐检索模式转变成信息管理&#xff0c;为音乐检索人员提供方便条件。对音乐检索的实际情况进行调研之后&#xff0c;进行详细的需求分析&#xff0c;对现有的管理模式进行改进&#x…

java基于springboot+vue协同过滤算法的音乐推荐系统

音乐是人类永恒的话题&#xff0c;无论是在古代还是现代人们对音乐都有一种非常的热爱在里面&#xff0c;同时音乐也寄语了人们对美好事物的憧憬&#xff0c;很多时候人们在试听音乐的时候并不能够及时的找到适合自己的音乐&#xff0c;而且当下很多音乐都是收费的&#xff0c;…

[附源码]java毕业设计网易云音乐推荐系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

基于python的音乐推荐系统

基于python的音乐推荐系统 算法:基于用户的协同过滤推荐算法 语言:python 数据库:sqlite 框架:django 编号:8448648225698568爱喝可乐的大学生

SpringBoot+Vue项目个性化音乐推荐系统

文末获取源码 开发语言&#xff1a;Java 框架&#xff1a;springbootvue Node&#xff1a;node.js JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7/8.0 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/idea,Visual Maven包…

如何使用Python实现音乐推荐系统

如何使用Python实现音乐推荐系统 在我的大学三年中&#xff0c;我最大的技术难题之一是如何使用Python实现音乐推荐系统。音乐推荐系统是基于用户听歌历史、用户喜好和音乐特征等因素&#xff0c;为用户推荐最合适的音乐。在这篇博客中&#xff0c;我将分享我是如何使用Python…

动手写简单的音乐推荐系统

简单音乐推荐系统的设计与实现 本文提供两种简单的传统音乐推荐系统&#xff08;next-songs 方向&#xff09;的思路与实现。&#xff08;数学原理和机器学习方法从略&#xff09; 下文仅给出思路以及关键代码&#xff0c;完整代码实现见: https://github.com/cdfmlr/murecom…

基于hadoop大数据的音乐推荐系统

1 简介 今天向大家介绍一个帮助往届学生完成的毕业设计项目&#xff0c;基于hadoop大数据的音乐推荐系统。 1.4 Hadoop优势&#xff08;4高&#xff09; 1.5 Hadoop 组成&#xff08;面试重点&#xff09; 1.5.1 HDFS 架构概述 Hadoop Distributed File System &#xff0c;简…

python音乐推荐系统_音乐推荐系统

音乐频道推荐业务,支持各个产品业务和策略。这里我先使用CB+CF+LR实现推荐部分,下面具体展开: 一、推荐系统流程图 CB,CF算法在召回阶段使用,推荐出来的item是粗排的,利用LR算法,可以将CB,CF召回来的item进行精排,然后选择分数最高,给用户推荐出来。后续我们可以采用…

(附源码)计算机毕业设计SSM音乐推荐系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

音乐推荐系统设计

文章目录 问题描述如何解决系统设计评测指标推荐系统的用户画像运动音乐场景用户行为分析睡眠音乐场景用户行为分析治愈音乐场景用户行为分析其他音乐场景用户行为分析 问题描述 移动网络和数字多媒体技术的飞速发展促进了数字音乐产业的共享与广泛传播&#xff0e;对用户而言…

音乐推荐系统(协同过滤和SVD)

python音乐推荐系统 首先对音乐数据集进行数据清洗和特征提取&#xff0c;基于矩阵分解方式来进行音乐推荐。 直接上源码和数据集文件 链接&#xff1a;https://pan.baidu.com/s/1Q45-pTRgXcQ4H-Z2WsRbVQ?pwd55z0 提取码&#xff1a;55z0音乐数据处理 读取音乐数据集&#x…

基于深度学习的音乐推荐系统简述

本文简要介绍我做的基于深度学习的音乐推荐系统。主要从需求分析与设计实现的角度来进行介绍。 &#xff08;一&#xff09;需求分析 基于深度学习的音乐推荐系统旨在以个性化音乐推荐模型为基础&#xff0c;使用B/S架构的形式实现。个性化推荐模型使用了 随机梯度下降&#x…

基于大数据的音乐推荐系统的设计与实现

基于大数据的音乐推荐系统是为了给听众推荐符合内心喜好的个性化系统。系统提供的功能有&#xff0c;音乐管理&#xff1a;管理员可以添加删除音乐&#xff0c;音乐查找&#xff1a;用户可以在系统中自行查找想要听的歌曲&#xff0c;音乐推荐&#xff1a;系统在收集了用户的行…

context-aware recommendation

智能手机的普及让大家随时随地都可接入互联网&#xff0c;而这样的随时随地的应用场景&#xff0c;也让传统推荐技术需要充分考虑&#xff0c;利用这些信息提升推荐的准确性&#xff0c;同时从另外一方面考虑&#xff0c; 这种符合LBS的推荐&#xff0c; 因为有了这些信息后&am…