210 lines
7.6 KiB
Plaintext
210 lines
7.6 KiB
Plaintext
数据显示错位问题 - 修复说明
|
||
=========================================
|
||
|
||
## 问题描述
|
||
|
||
从截图看到的问题:
|
||
- 试样1的列1显示了数据(33.45吸水时间, 12.00吸芯高度)✓ 正确
|
||
- 试样1的列2应该显示吸芯高度数据,但显示为0.00 ✗ 错误
|
||
- 试样1的列3显示了芯吸速率21.52 ✗ 错误(应该在列3,但数据位置不对)
|
||
- 试样2、3、4的数据都错位了
|
||
|
||
## 根本原因
|
||
|
||
DataGridView的AutoGenerateColumns可能导致列的自动生成与手动定义的列冲突,造成数据绑定错位。
|
||
|
||
## 修复方案
|
||
|
||
### 1. 禁用自动生成列
|
||
在InitializeDataGridView方法开始时添加:
|
||
```csharp
|
||
dataGridView1.AutoGenerateColumns = false;
|
||
```
|
||
|
||
### 2. 先解除数据绑定再清除列
|
||
```csharp
|
||
dataGridView1.DataSource = null; // 先解除绑定
|
||
dataGridView1.Columns.Clear(); // 再清除列
|
||
```
|
||
|
||
### 3. 显式创建每个列对象
|
||
不使用匿名对象,而是显式创建DataGridViewTextBoxColumn对象:
|
||
```csharp
|
||
DataGridViewTextBoxColumn col1 = new DataGridViewTextBoxColumn
|
||
{
|
||
Name = $"试样{i}_1",
|
||
HeaderText = $"试样{i}\n1",
|
||
DataPropertyName = $"试样{i}_1", // 关键:确保与DataTable列名完全匹配
|
||
Width = 100,
|
||
ReadOnly = false
|
||
};
|
||
dataGridView1.Columns.Add(col1);
|
||
```
|
||
|
||
### 4. 添加调试信息
|
||
在InitializeDataGridView和GenerateMockData方法中添加调试输出:
|
||
```csharp
|
||
System.Diagnostics.Debug.WriteLine($"列{i}: Name={col.Name}, DataPropertyName={col.DataPropertyName}");
|
||
```
|
||
|
||
## 验证步骤
|
||
|
||
### 步骤1:查看输出窗口
|
||
1. 在Visual Studio中打开"输出"窗口(视图 → 输出)
|
||
2. 运行程序
|
||
3. 查看"=== DataGridView 列信息 ==="部分
|
||
4. 确认每列的Name和DataPropertyName都正确
|
||
|
||
预期输出:
|
||
```
|
||
=== DataGridView 列信息 ===
|
||
DataTable 列数: 16
|
||
DataGridView 列数: 16
|
||
列0: Name=序号, DataPropertyName=序号
|
||
列1: Name=试样1_1, DataPropertyName=试样1_1
|
||
列2: Name=试样1_2, DataPropertyName=试样1_2
|
||
列3: Name=试样1_3, DataPropertyName=试样1_3
|
||
列4: Name=试样2_1, DataPropertyName=试样2_1
|
||
...
|
||
```
|
||
|
||
### 步骤2:生成模拟数据
|
||
1. 点击"模拟数据"按钮
|
||
2. 查看输出窗口的数据生成信息
|
||
3. 确认数据正确填充到对应的列
|
||
|
||
预期输出:
|
||
```
|
||
=== 模拟数据生成完成 ===
|
||
吸水时间 - 试样1_1 = 32.45
|
||
吸芯高度 - 试样1_1 = 55.23
|
||
吸芯高度 - 试样1_2 = 58.67
|
||
吸芯高度 - 试样1_3 = 62.11
|
||
芯吸速率 - 试样1_3 = 108.50
|
||
```
|
||
|
||
### 步骤3:验证界面显示
|
||
检查表格显示是否正确:
|
||
|
||
```
|
||
┌─────────────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┐
|
||
│ 序号 │试样1│ │ │试样2│ │ │试样3│ │ │试样4│ │ │试样5│ │ │
|
||
│ │ 1 │ 2 │ 3 │ 1 │ 2 │ 3 │ 1 │ 2 │ 3 │ 1 │ 2 │ 3 │ 1 │ 2 │ 3 │
|
||
├─────────────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┤
|
||
│吸水时间(s) │32.45│ │ │31.23│ │ │33.67│ │ │30.89│ │ │32.11│ │ │
|
||
├─────────────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┤
|
||
│吸芯高度(mm) │55.23│58.67│62.11│60.45│65.23│58.90│52.34│68.12│71.45│63.78│59.23│66.89│57.12│61.45│69.23│
|
||
├─────────────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┤
|
||
│芯吸速率 │ │ │108.5│ │ │120.3│ │ │115.7│ │ │125.4│ │ │118.9│
|
||
│(mm/min) │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
|
||
└─────────────┴────┴────┴────┴────┴────┴────┴────┴────┴────┴────┴────┴────┴────┴────┴────┘
|
||
```
|
||
|
||
## 正确的数据分布
|
||
|
||
### 吸水时间(s)行
|
||
- 试样1_1: 有数据 ✓
|
||
- 试样1_2: 空白 ✓
|
||
- 试样1_3: 空白 ✓
|
||
- 试样2_1: 有数据 ✓
|
||
- 试样2_2: 空白 ✓
|
||
- 试样2_3: 空白 ✓
|
||
- ... 以此类推
|
||
|
||
### 吸芯高度(mm)行
|
||
- 试样1_1: 有数据 ✓
|
||
- 试样1_2: 有数据 ✓
|
||
- 试样1_3: 有数据 ✓
|
||
- 试样2_1: 有数据 ✓
|
||
- 试样2_2: 有数据 ✓
|
||
- 试样2_3: 有数据 ✓
|
||
- ... 以此类推
|
||
|
||
### 芯吸速率(mm/min)行
|
||
- 试样1_1: 空白 ✓
|
||
- 试样1_2: 空白 ✓
|
||
- 试样1_3: 有数据 ✓
|
||
- 试样2_1: 空白 ✓
|
||
- 试样2_2: 空白 ✓
|
||
- 试样2_3: 有数据 ✓
|
||
- ... 以此类推
|
||
|
||
## 如果问题仍然存在
|
||
|
||
### 检查1:DataTable列顺序
|
||
确认InitializeDataTable方法中列的创建顺序:
|
||
```csharp
|
||
sampleDataTable.Columns.Add("序号", typeof(string));
|
||
for (int i = 1; i <= 5; i++)
|
||
{
|
||
sampleDataTable.Columns.Add($"试样{i}_1", typeof(double));
|
||
sampleDataTable.Columns.Add($"试样{i}_2", typeof(double));
|
||
sampleDataTable.Columns.Add($"试样{i}_3", typeof(double));
|
||
}
|
||
```
|
||
|
||
### 检查2:DataGridView列顺序
|
||
确认InitializeDataGridView方法中列的添加顺序与DataTable完全一致。
|
||
|
||
### 检查3:DataPropertyName
|
||
确认每个DataGridView列的DataPropertyName与DataTable列名完全匹配(区分大小写)。
|
||
|
||
### 检查4:AutoGenerateColumns
|
||
确认dataGridView1.AutoGenerateColumns = false已设置。
|
||
|
||
## 调试技巧
|
||
|
||
### 技巧1:在CellFormatting事件中添加断点
|
||
```csharp
|
||
private void DataGridView1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
|
||
{
|
||
// 在这里添加断点
|
||
string columnName = dataGridView1.Columns[e.ColumnIndex].Name;
|
||
string dataPropertyName = dataGridView1.Columns[e.ColumnIndex].DataPropertyName;
|
||
// 检查columnName和dataPropertyName是否匹配
|
||
}
|
||
```
|
||
|
||
### 技巧2:手动检查单元格值
|
||
在GenerateMockData方法后添加:
|
||
```csharp
|
||
for (int row = 0; row < dataGridView1.Rows.Count; row++)
|
||
{
|
||
for (int col = 0; col < dataGridView1.Columns.Count; col++)
|
||
{
|
||
var value = dataGridView1.Rows[row].Cells[col].Value;
|
||
Debug.WriteLine($"行{row}列{col}({dataGridView1.Columns[col].Name}): {value}");
|
||
}
|
||
}
|
||
```
|
||
|
||
## 预期结果
|
||
|
||
修复后,数据应该正确显示在对应的列中:
|
||
- 试样1的数据只显示在试样1的3列中
|
||
- 试样2的数据只显示在试样2的3列中
|
||
- 以此类推
|
||
- 不会出现数据错位或串列的情况
|
||
|
||
## 修改的文件
|
||
|
||
- WindowsFormsApp6/Form3.cs
|
||
- InitializeDataGridView() 方法
|
||
- GenerateMockData() 方法
|
||
|
||
## 测试清单
|
||
|
||
□ 启动程序,查看输出窗口的列信息
|
||
□ 点击"模拟数据"按钮
|
||
□ 检查吸水时间行:只有试样X_1列有数据
|
||
□ 检查吸芯高度行:所有3列都有数据
|
||
□ 检查芯吸速率行:只有试样X_3列有数据
|
||
□ 检查数据是否对齐(试样1的数据在试样1的列中)
|
||
□ 尝试编辑吸芯高度行的任意列
|
||
□ 检查编辑后芯吸速率是否自动更新
|
||
□ 导出Excel,检查数据是否正确
|
||
|
||
修复日期:2025-12-30
|
||
修复状态:✅ 已修复
|
||
测试状态:⏳ 待测试
|