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) |
| 分隔处理 | 用逗号连接数据 | 按逗号分割字符串 |
| 表头处理 | 写入列名 | 读取为列定义 |
💡 记忆口诀
-
序列化 = 保存 = 数据变文件
-
反序列化 = 加载 = 文件变数据
-
CSV格式:表头一行 + 数据多行,逗号分隔
-
流程:对话框选文件 → 读/写行 → 分割/连接 → 绑定/保存
🎯 一句话总结
序列化:DataTable → CSV文件(保存数据)
反序列化:CSV文件 → DataTable(加载数据)