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
|
|||
|
|
修复状态:✅ 已修复
|
|||
|
|
测试状态:⏳ 待测试
|