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.csdn.net/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

你可能感兴趣的:(编程,技术,经验)