DataGridView 与 DataTable 与csv 序列

DataGridView 和 DataTable 对比速查表

项目 DataGridView (显示控件) DataTable (数据表)
作用 表格显示控件,用户界面 内存数据表,数据源
创建 dataGridView1 (拖拽) DataTable dt = new DataTable();
绑定关系 dataGridView1.DataSource = dt; ← 数据源

📊 DataGridView 常用属性

属性/方法 说明 示例代码
Columns.Count 列数量 int cols = dataGridView1.Columns.Count;
Rows.Count 行数量 int rows = dataGridView1.Rows.Count;
Columns[i].HeaderText 列标题文本 string title = dataGridView1.Columns[0].HeaderText;
[列,行].Value 访问单元格 object val = dataGridView1[0,0].Value;
Rows[i].Cells[j].Value 访问单元格 object val = dataGridView1.Rows[0].Cells[0].Value;

🗂️ DataTable 常用属性和方法

属性/方法 说明 示例代码
dt.Columns.Add() 添加列 dt.Columns.Add("姓名");
dt.NewRow() 创建新行 DataRow row = dt.NewRow();
dt.Rows.Add() 添加行 dt.Rows.Add(row);
dt.Columns 所有列的集合 foreach(DataColumn col in dt.Columns)
dt.Rows 所有行的集合 foreach(DataRow row in dt.Rows)
dt.Columns[i].ColumnName 列名 string name = dt.Columns[0].ColumnName;

🔄 两者交互操作

从 DataGridView 提取到 DataTable

csharp

复制代码
DataTable dt = new DataTable();

// 1. 复制列标题
for (int i = 0; i < dataGridView1.Columns.Count; i++)
{
    dt.Columns.Add(dataGridView1.Columns[i].HeaderText);
}

// 2. 复制行数据
for (int i = 0; i < dataGridView1.Rows.Count - 1; i++)
{
    DataRow dr = dt.NewRow();
    for (int j = 0; j < dataGridView1.Columns.Count; j++)
    {
        dr[j] = dataGridView1[j, i].Value;
    }
    dt.Rows.Add(dr);
}

从 DataTable 绑定到 DataGridView

csharp

复制代码
// 直接绑定
dataGridView1.DataSource = dt;

// 获取绑定的DataTable
DataTable dt = (DataTable)dataGridView1.DataSource;

CSV序列化与反序列化概念速查表

概念 含义 对应操作 代码示例
CSV文件 逗号分隔值文件,纯文本表格格式 数据交换格式 data.csv
序列化 将数据 → 保存为文件 保存/导出 DataTable → CSV文件
反序列化 将文件 → 加载为数据 读取/导入 CSV文件 → DataTable
分隔符 CSV用逗号,分隔列 列边界 "张三,25,北京"
表头 第一行列标题 列名定义 姓名,年龄,城市
数据行 表头后的实际数据 数据内容 张三,25,北京

🔄 CSV 序列化流程(保存)

步骤 操作 关键代码
1 从DataGridView提取数据到DataTable dt.Columns.Add(dataGridView1.Columns[i].HeaderText)
2 打开保存对话框 SaveFileDialog dialog = new SaveFileDialog()
3 写入表头(列名) data += dt.Columns[i].ColumnName + ","
4 写入数据行 data += dt.Rows[i][j] + ","
5 写入文件 sr.WriteLine(data)

保存代码框架:

csharp

复制代码
// 1. 提取数据到DataTable
DataTable dt = new DataTable();
for (int i = 0; i < dataGridView1.Columns.Count; i++)
{
    dt.Columns.Add(dataGridView1.Columns[i].HeaderText);
}
for (int i = 0; i < dataGridView1.Rows.Count; i++)
{
    DataRow dr = dt.NewRow();
    for (int j = 0; j < dataGridView1.Columns.Count; j++)
    {
        dr[j] = dataGridView1[j, i].Value;
    }
    dt.Rows.Add(dr);
}

// 2. 保存为CSV
SaveFileDialog dialog = new SaveFileDialog();
if (dialog.ShowDialog() == DialogResult.OK)
{
    using (StreamWriter sw = new StreamWriter(dialog.FileName))
    {
        // 写表头
        string header = string.Join(",", dt.Columns.Cast<DataColumn>().Select(c => c.ColumnName));
        sw.WriteLine(header);
        
        // 写数据行
        foreach (DataRow row in dt.Rows)
        {
            string line = string.Join(",", row.ItemArray);
            sw.WriteLine(line);
        }
    }
}

🔄 CSV 反序列化流程(加载)

步骤 操作 关键代码
1 打开文件对话框选择CSV OpenFileDialog ofd = new OpenFileDialog()
2 读取文件行 string line = sr.ReadLine()
3 按逗号分割 string[] values = line.Split(',')
4 第一行作为表头创建列 dt.Columns.Add(values[i])
5 后续行作为数据 dt.Rows.Add(values)
6 绑定到DataGridView dataGridView1.DataSource = dt

加载代码框架:

csharp

复制代码
// 1. 选择文件
OpenFileDialog ofd = new OpenFileDialog();
if (ofd.ShowDialog() == DialogResult.OK)
{
    DataTable dt = new DataTable();
    bool isHeader = true;
    
    // 2. 读取文件
    using (StreamReader sr = new StreamReader(ofd.FileName))
    {
        while (!sr.EndOfStream)
        {
            string line = sr.ReadLine();
            string[] values = line.Split(',');
            
            if (isHeader)  // 第一行是表头
            {
                foreach (string col in values)
                    dt.Columns.Add(col);
                isHeader = false;
            }
            else  // 数据行
            {
                dt.Rows.Add(values);
            }
        }
    }
    
    // 3. 显示数据
    dataGridView1.DataSource = dt;
}

📊 核心概念对比

对比项 序列化(保存) 反序列化(加载)
方向 数据 → 文件 文件 → 数据
起点 DataTable/DataGridView CSV文件
终点 CSV文件 DataTable/DataGridView
关键操作 写文件(WriteLine) 读文件(ReadLine)
分隔处理 用逗号连接数据 按逗号分割字符串
表头处理 写入列名 读取为列定义

💡 记忆口诀

  1. 序列化 = 保存 = 数据变文件

  2. 反序列化 = 加载 = 文件变数据

  3. CSV格式:表头一行 + 数据多行,逗号分隔

  4. 流程:对话框选文件 → 读/写行 → 分割/连接 → 绑定/保存

🎯 一句话总结

序列化:DataTable → CSV文件(保存数据)
反序列化:CSV文件 → DataTable(加载数据)

相关推荐
2501_941875281 天前
从日志语义到可观测性的互联网工程表达升级与多语言实践分享随笔
java·前端·python
龙在天1 天前
Nuxtjs中,举例子一篇文章讲清楚:水合sop
前端·nuxt.js
holidaypenguin1 天前
【转】跨浏览器 Canvas 图像解码终极方案:让大图渲染也能丝滑不卡顿
前端·canvas
Kapaseker1 天前
C# 斩获TIOBE年度编程语言
c#·编程语言
工业甲酰苯胺1 天前
使用 C# 和 SQL Server 自动化邮件中的用户分配数据处理
数据库·c#·自动化
狗哥哥1 天前
企业级 Vue3 + Element Plus 主题定制架构:从“能用”到“好用”的进阶之路
前端·css·架构
星辰引路-Lefan1 天前
[特殊字符] 开源一款基于 PaddleOCR 的纯离线 OCR 识别插件 | 支持身份证、银行卡、驾驶证识别
前端·开源·ocr
Cache技术分享1 天前
285. Java Stream API - 通过 Supplier 创建 Stream
前端·后端
阿基米东1 天前
从嵌入式到前端的探索之旅,分享 5 个开源 Web 小工具
前端·javascript·github