C# datagridView 控件使用心得

首先本人的需求是,通过UI编辑一个表格文件,然后将其存储起来。
同时也可以对其进行载入,话不多说先上图片

dataGridView1 的初始化,这个控件的初始化可以使用UI界面的设置,也可以使用程序:

            Column1 = new System.Windows.Forms.DataGridViewTextBoxColumn();Column2 = new System.Windows.Forms.DataGridViewTextBoxColumn();Column3 = new System.Windows.Forms.DataGridViewTextBoxColumn();Column4 = new System.Windows.Forms.DataGridViewTextBoxColumn();this.Column1.Name = "Column1";this.Column2.Name = "Column2";this.Column3.Name = "Column3";this.Column4.Name = "Column4";Column1.HeaderText = "抓手No";Column2.HeaderText = "X";Column3.HeaderText = "Y";Column4.HeaderText = "Z";dataGridView1.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] {Column1,Column2,Column3,Column4});

增加一行的代码如下:

            int idx= dataGridView1.Rows.Add(1);dataGridView1.Rows[idx].Cells[0].Value = idx.ToString();dataGridView1.Rows[idx].Cells[1].Value = tBx.Text.ToString();dataGridView1.Rows[idx].Cells[2].Value = tBy.Text.ToString();dataGridView1.Rows[idx].Cells[3].Value = tBz.Text.ToString();

删除行尾:

            int idx = dataGridView1.RowCount - 1;dataGridView1.Rows.RemoveAt(idx);

删除选中行:

            for (int i = dataGridView1.SelectedRows.Count; i > 0; i--){dataGridView1.Rows.RemoveAt(dataGridView1.SelectedRows[i - 1].Index);}

读写文件整理到了这个工具类里:

using System;
using System.Collections.Generic;
using System.Data;
using System.IO;
using System.Linq;
using System.Text;
using System.Windows.Forms;namespace buttonMV
{class CsvHelper{public DataTable readCSV(){//获取文件名string strFileName = "";OpenFileDialog ofd = new OpenFileDialog();ofd.Filter = "CSV文件(*.csv)|*.csv|word文档(*.doc;*.docx)|*.doc;*.docx|所有文件|*.*";ofd.ValidateNames = true; // 验证用户输入是否是一个有效的Windows文件名ofd.CheckFileExists = true; //验证路径的有效性ofd.CheckPathExists = true;//验证路径的有效性if (ofd.ShowDialog() == DialogResult.OK) //用户点击确认按钮,发送确认消息{strFileName = ofd.FileName;//获取在文件对话框中选定的路径或者字符串}string filePath = strFileName;var dt = new DataTable();// Creating the columnsFile.ReadLines(filePath).Take(1).SelectMany(x => x.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries)).ToList().ForEach(x => dt.Columns.Add(x.Trim()));// Adding the rowsFile.ReadLines(filePath).Skip(1).Select(x => x.Split(',')).ToList().ForEach(line => dt.Rows.Add(line));return dt;}public void DataGridViewToExcel(DataGridView dgv){//程序实例化SaveFileDialog控件,并对该控件相关参数进行设置SaveFileDialog dlg = new SaveFileDialog();dlg.Filter = "Execl files (*.csv)|*.csv";dlg.FilterIndex = 0;dlg.RestoreDirectory = true;dlg.CreatePrompt = true;dlg.Title = "保存为csv文件";//以上过程也可以通过添加控件,再设置控件属性完成,此处用程序编写出来了,在移植时就可摆脱控件的限制if (dlg.ShowDialog() == DialogResult.OK)//打开SaveFileDialog控件,判断返回值结果{Stream myStream;//流变量myStream = dlg.OpenFile();//返回SaveFileDialog控件打开的文件,并将所选择的文件转化成流StreamWriter sw = new StreamWriter(myStream, System.Text.Encoding.GetEncoding(-0));//将选择的文件流生成写入流string columnTitle = "";try{//写入列标题    for (int i = 0; i < dgv.ColumnCount; i++){if (i > 0){columnTitle += ",";}columnTitle += dgv.Columns[i].HeaderText;//符号 , 的添加,在保存为Excel时就以 , 分成不同的列了}sw.WriteLine(columnTitle);//将内容写入文件流中//写入列内容    for (int j = 0; j < dgv.Rows.Count; j++){string columnValue = "";for (int k = 0; k < dgv.Columns.Count; k++){if (k > 0){columnValue += ",";}if (dgv.Rows[j].Cells[k].Value == null)columnValue += "";else if (dgv.Rows[j].Cells[k].Value.ToString().Contains(",")){columnValue += "\"" + dgv.Rows[j].Cells[k].Value.ToString().Trim() + "\"";//将单元格中的,号转义成文本}else{columnValue += dgv.Rows[j].Cells[k].Value.ToString().Trim() + "\t";//\t 横向跳格}}//获得写入到列中的值sw.WriteLine(columnValue);//将内容写入文件流中}sw.Close();//关闭写入流myStream.Close();//关闭流变量MessageBox.Show("导出表格成功!");}catch (Exception e){MessageBox.Show("导出表格失败!");}finally{sw.Close();myStream.Close();}}else{MessageBox.Show("取消导出表格操作!");}}}
}

导出文件:

            CsvHelper csvWriter = new CsvHelper();csvWriter.DataGridViewToExcel(dataGridView1);

导入文件:

 CsvHelper csvReader = new CsvHelper();DataTable table = csvReader.readCSV();//获取表格的列数int columNum = table.Columns.Count;foreach (DataRow row in table.Rows){int idx = dataGridView1.Rows.Add(1);for (int i = 0; i < columNum; i++){string columName = table.Columns[i].ColumnName;dataGridView1.Rows[idx].Cells[i].Value = row[columName].ToString();}}

扩展:C#中DataGridView控件使用大全及C#学习心得-CSDN博客

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

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

相关文章

Python武器库开发-flask篇之flask框架的安装(二十一)

Flask介绍 Flask是一个基于Python开发并且依赖jinja2模板和Werkzeug WSGI服务的一个微型框架&#xff0c;对于Werkzeug本质是Socket服务端&#xff0c;其用于接收http请求并对请求进行预处理&#xff0c;然后触发Flask框架&#xff0c;开发人员基于Flask框架提供的功能对请求进…

LeetCode 1334. 阈值距离内邻居最少的城市:多次运用单源最短路的迪杰斯特拉算法

【LetMeFly】1334.阈值距离内邻居最少的城市&#xff1a;多次运用单源最短路的迪杰斯特拉算法 力扣题目链接&#xff1a;https://leetcode.cn/problems/find-the-city-with-the-smallest-number-of-neighbors-at-a-threshold-distance/ 有 n 个城市&#xff0c;按从 0 到 n-1…

03 # 类型基础:动态类型与静态类型

通俗定义 静态类型语言&#xff1a;在编译阶段确定所有变量的类型 编译阶段确定属性偏移量用偏移量访问代替属性名访问偏移量信息共享 动态类型语言&#xff1a;在执行阶段确定所有变量的类型 在程序运行时&#xff0c;动态计算属性偏移量需要额外的空间存储属性名所有对象的…

【每日一题】—— D. Epic Transformation(Codeforces Round 710 (Div. 3))(找规律+贪心)

&#x1f30f;博客主页&#xff1a;PH_modest的博客主页 &#x1f6a9;当前专栏&#xff1a;每日一题 &#x1f48c;其他专栏&#xff1a; &#x1f534; 每日反刍 &#x1f7e1; C跬步积累 &#x1f7e2; C语言跬步积累 &#x1f308;座右铭&#xff1a;广积粮&#xff0c;缓称…

spring cloud微服务中多线程下,子线程通过feign调用其它服务,请求头token等丢失

在线程池中&#xff0c;子线程调用其他服务&#xff0c;请求头丢失&#xff0c;token为空的情况 看了很多篇文章的处理方法和在自己亲测的情况下做出说明&#xff1a; 第一种&#xff1a; 这种方式只支持在主线程情况下&#xff0c;能够处理&#xff0c;在多线程情况下&#…

桥接模式 rust和java的实现

文章目录 桥接模式介绍应用实例优点缺点使用场景关键角色 实现javarsut rust代码仓库 桥接模式 桥接&#xff08;Bridge&#xff09;是用于把抽象化与实现化解耦&#xff0c;使得二者可以独立变化。这种类型的设计模式属于结构型模式&#xff0c;它通过提供抽象化和实现化之间…

GZ038 物联网应用开发赛题第6套

2023年全国职业院校技能大赛 高职组 物联网应用开发 任 务 书 &#xff08;第6套卷&#xff09; 工位号&#xff1a;______________ 第一部分 竞赛须知 一、竞赛要求 1、正确使用工具&#xff0c;操作安全规范&#xff1b; 2、竞赛过程中如有异议&#xff0c;可向现场考评…

efcore反向共工程,单元测试

1.安装efcore需要的nuget <PackageReference Include"Microsoft.EntityFrameworkCore" Version"6.0.24" /> <PackageReference Include"Microsoft.EntityFrameworkCore.SqlServer" Version"6.0.24" /> <PackageRefere…

机器视觉工程师,实际上调机仔需要居多,不需要那么多会机器视觉开发的,实际上机器视觉公司根本养不起

不要机器视觉开发等着倒闭&#xff0c;要那么多机器视觉开发是想倒闭&#xff0c;根本养不起。 人力对于机器视觉企业来说&#xff0c;仅仅是成本&#xff0c;也可以是剥削利润。当机器视觉公司开发一款标准软件后&#xff0c;意味着什么&#xff1f;技术可以复制&#xff0c;粘…

02 # 类型基础:强类型与弱类型

宽泛的定义 在强类型语言中&#xff0c;当一个对象从调用函数传递到被调用函数时&#xff0c;其类型必须与被调用函数中声明的类型兼容 – Liskov, Zilles 1974 通俗定义 强类型语言不允许改变变量的数据类型&#xff0c;除非进行强制类型转换 比如下面 Java 里不能将布尔类…

多维时序 | MATLAB实现PSO-LSTM-Attention粒子群优化长短期记忆神经网络融合注意力机制的多变量时间序列预测

多维时序 | MATLAB实现PSO-LSTM-Attention粒子群优化长短期记忆神经网络融合注意力机制的多变量时间序列预测 目录 多维时序 | MATLAB实现PSO-LSTM-Attention粒子群优化长短期记忆神经网络融合注意力机制的多变量时间序列预测预测效果基本介绍模型描述程序设计参考资料 预测效果…

Vue 3.0 + vite + axios+PHP跨域问题的解决办法

最后一个Web项目&#xff0c;采用前后端分离。 前端&#xff1a;Vue 3.0 viteelement plus 后端&#xff1a;PHP 运行时前端和后端是两个程序&#xff0c;前端需要时才向后端请求数据。由于是两个程序&#xff0c;这就会出现跨域问题。 比如前端某个地方需要请求的接口如下…