C#读目录里面所有CSV文件数据表,显示到DataGridView

目的

读取CSV文件,包含题头的数据表格,显示到WinForm。 使用了锐视SeeSharp工具包。

CSV读取

一开始打算自己干写,觉得这个链接文章有用:
https://www.cnblogs.com/lcidy/p/9700187.html

后来看了简仪SeeSharp Tools的范例,问了LJY,有我需要的API,就成了这样:

//引用段
using SeeSharpTools.JY.File;
...
//方法定义变量
string[,] data= null;

//方法里面的调用
data= CsvHandler.Read<string>(文件路径名,(long) 0,0,-1,-1,Encoding.UTF8);
//CsvHandler.Read有多个数据类型和调用定义的重载,可根据需要自取; 我用了编码定义, 避免中文乱码

DataGridView

较完整参考:
https://blog.youkuaiyun.com/angel20082008/article/details/51718676

我的任务比较简单:

//读入栏头,用循环加入列:
dataGridViewWavSpec.Columns.Add()
//or 你知道要多少列
dataGridViewIDResults.ColumnCount = 要几列写多少;
//*********************
//加完头,逐行加内容:
dataGridViewWavSpec.Rows.Add();
//写个循环,变量k,逐个加这行的各列内容:
dataGridViewWavSpec.Rows[行号].Cells[k].Value = 表格数据

遍历目录

详细参考,一个递归算法
https://www.cnblogs.com/fuqiang88/p/7866458.html

我简单, 就读取一个目录里面所有的csv,可以:

//引用
using System.IO;
//正文代码
            DirectoryInfo fdir = new DirectoryInfo(_pathOfSpecs);
            FileInfo[] files = fdir.GetFiles("*.csv");

在一个WinForm弹出另一个WinForm

https://www.cnblogs.com/tommy-huang/p/4539999.html

    Form1 form1 = new Form1();
    form1.Show(); //并行运行
    //或者
    form1.ShowDialog(); //阻塞运行, 退出form1才能继续

检查文件是否存在

if (File.Exists("full file name"))

选择文件夹FolderBrowserDialog

本来想用OpenFileDialog去掉文件选择检查就可以, 但是发现必须填写一个文件名,让用户迷惑。 用了FolderBrowserDialog, 但是看不到桌面shortcut了,不爽。 检查了一些论坛, 最后发现, 微软就是推荐这个不方便的FolderBrowserDialog。
https://docs.microsoft.com/en-us/dotnet/api/system.windows.forms.openfiledialog?view=netframework-4.7.2

            FolderBrowserDialog dialog = new FolderBrowserDialog();
            dialog.Description = "请选择你需要的文件夹";
            if (dialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                //在这里干活
            }

还要写个进度条

后台计算的时候界面线程是锁死的,直接写控件属性不行,得用跨线程调用技术。 详细:
https://www.cnblogs.com/TankXiao/p/3348292.html#delegateinvoke

推荐比较标准的BackgroundWorker,如果简单使用的话推荐第二种办法(delegate Invoke)

我看不懂,请教简仪LJW,得到一行金代码:

//前面要显示进度条
progressBar.Visible = true;
//进入循环,金光代码:
Invoke(new Action(() => { progressBar.Value = 100 * i / (循环长度 - 1); }));
//出了循环隐藏进度条,不然进度条有动画呼吸效果,太扎眼
progressBar.Visible = false;

实际上这个写法就是前面链接帖子的方法2,只是更容易看。

加餐backgroundWorker

软件里面连续处理一堆数据文件,导致GUI锁死,采用backgroundWorker解决:
背景知识:
https://www.cnblogs.com/sparkdev/p/5906272.html
补充,关闭窗体时如果backgroundWorker在跑,要拦截事件:
https://stackoverflow.com/questions/1731384/how-to-stop-backgroundworker-on-forms-closing-event
主要工作:

  1. 将主体处理循环方法设为backgroudWorker
    . Form里面放一个backgroundWorker
    . 设定其Name,打开Asynchronous 里面 WorkerReportsProgress和WorkerSupportsCancellation为True
    . 通过双击建立DoWork、ProgressChanged、RunWorkerCompleted事件
  2. DoWork里面是数据处理
  3. ProgressChanged里面显示进度(进度条和状态显示)
  4. RunWorkerCompleted里面影藏进度条和抓住异常
  5. 处理按钮事件触发后台运行控件
    . 点击处理事件使能进度条,清空报表dataGridView
    . 启动
backgroundWorker1.RunWorkerAsync();
  1. backgroundWorker工作时屏蔽FormClosing
C#中,使用DataGridView显示CSV文件时可能会遇到中文显示乱码的问题。这通常是因为CSV文件编码和DataGridView默认的系统字符集不匹配导致的。以下是一些步骤来解决这个问题: 1. **CSV文件**: 使用`StreamReader`和`CsvHelper`库(如果项目中未包含,需要安装`CsvHelper`),首先CSV内容,例如: ```csharp using CsvHelper; using System.IO; string filePath = "path_to_your_csv.csv"; using (var reader = new StreamReader(filePath)) using (var csv = new CsvReader(reader, CultureInfo.InvariantCulture)) { var records = csv.GetRecords<dynamic>(); // 现在records集合包含了CSV数据 } ``` 2. **转换为DataTable或List<DataGridViewRow>**: 将CSV数据转化为适合DataGridView的数据结构,如DataTable或自定义列表。 3. **设置 DataGridView 的 Culture 和 Column 的 DisplayMember**: 初始化DataGridView并指定正确的CultureInfo来处理中文: ```csharp DataGridView dgv = new DataGridView(); dgv.DefaultCellStyle Cultura = new DataGridViewCellStyle(); Cultura-numberFormat = @"#.00"; Cultura Cultura = CultureInfo.GetCultureInfo("zh-CN"); dgv.DefaultCellStyle.CurrentCulture = Cultura; // 如果是DataTable dgv.DataSource = new BindingSource(records.ToDataTable(), null); // 或者如果是自定义列表 dgv.DataSource = records.ToList(); dgv.Columns[0].DefaultCellStyle.Format = "N2"; // 根据实际列名调整索引 // 设置DisplayMember以确定从哪一列显示 dgv.DisplayMember = "YourColumnName"; ``` 4. **注意文件编码**: 确保你的CSV文件是UTF-8编码的,因为这是Windows系统默认的文本文件编码。如果不是,可以尝试转换或在取时指定正确的编码。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值