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;
Columnsi.HeaderText 列标题文本 string title = dataGridView1.Columns[0].HeaderText;
列,行.Value 访问单元格 object val = dataGridView1[0,0].Value;
Rowsi.Cellsj.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.Columnsi.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(加载数据)

相关推荐
CoderIsArt7 小时前
C#中UI 线程与 Dispatcher
开发语言·ui·c#
东风破_7 小时前
danci 项目(三):从 JSON 数据到 AI Coding,真实项目里的数据清洗、Prompt 和工程规范
前端·后端·node.js
东风破_8 小时前
danci 项目(一):从需求到架构,一个单词学习系统为什么会这样设计
前端·后端·node.js
蒲公英eric8 小时前
从客户端到服务端:DVWA DOM 型 XSS 模块完整漏洞分析教程
前端·web安全·ai·xss·dvwa·ai安全
单线程_018 小时前
从案例分析 Vue3 Tokenizer+Parser 源码三
前端·javascript·vue.js
顶点多余9 小时前
那些在算法中适合巩固的知识点---1
java·前端·算法
Setsuna_F_Seiei9 小时前
前端转型 Agent 开发 03 之 Agent Tools - 给 Agent 装上手脚
前端·agent·ai编程
jay神9 小时前
【计算机毕业设计】基于SpringBoot的程序教学辅助系统
java·前端·vue.js·spring boot·后端·毕业设计·课程设计
kyriewen12 小时前
我装了30多个Skill,给AI安排了8个岗位
前端·javascript·ai编程
风骏时光牛马12 小时前
大模型落地实践中的技术选型思路与方案对比
前端