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

相关推荐
Mr Xu_10 小时前
Vue 3 中计算属性的最佳实践:提升可读性、可维护性与性能
前端·javascript
jerrywus11 小时前
我写了个 Claude Code Skill,再也不用手动切图传 COS 了
前端·agent·claude
玖月晴空11 小时前
探索关于Spec 和Skills 的一些实战运用-Kiro篇
前端·aigc·代码规范
子兮曰11 小时前
深入理解滑块验证码:那些你不知道的防破解机制
前端·javascript·canvas
czhc114007566311 小时前
通信 28
c#
会一丢丢蝶泳的咻狗11 小时前
Sass实现,蛇形流动布局
前端·css
攀登的牵牛花11 小时前
前端向架构突围系列 - 状态数据设计 [8 - 4]:有限状态机 (FSM) 在复杂前端逻辑中的应用
前端
Lsx_11 小时前
前端视角下认识 AI Agent 和 LangChain
前端·人工智能·agent
我是伪码农12 小时前
Vue 智慧商城项目
前端·javascript·vue.js
不认输的西瓜12 小时前
fetch-event-source源码解读
前端·javascript