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(加载数据)

相关推荐
恋猫de小郭11 分钟前
Amper 正式转正 Kotlin Toolchain ,Gradle 未来何去何从
android·前端·flutter
敲代码的彭于晏19 分钟前
Bean 生命周期完全图解:前端同学也能看懂的 Spring 核心机制
java·前端·后端
IT_陈寒25 分钟前
Redis内存飙升的锅,原来是我没搞懂这个过期策略
前端·人工智能·后端
云浪32 分钟前
前端二进制数组完全指南:ArrayBuffer、TypedArray、DataView 一次讲透
前端·javascript
张风捷特烈34 分钟前
Flutter 类库大揭秘#02 | path_provider 各平台实现
前端·flutter
铁皮饭盒1 小时前
26年bunjs, elysia+pg一把梭, redis都省了
前端·javascript·后端
lichenyang45314 小时前
Docker 学习笔记(一):为什么需要镜像、容器和仓库?
前端
kyriewen14 小时前
别再对着 TypeScript 报错发呆了:我把 10 个最常见的红色波浪线翻译成了人话
前端·javascript·typescript
IT_陈寒14 小时前
SpringBoot自动配置的坑,我的API突然就404了
前端·人工智能·后端