更新
This commit is contained in:
@@ -37,6 +37,7 @@ namespace WindowsFormsApp6
|
|||||||
private DataTable sampleDataTable;
|
private DataTable sampleDataTable;
|
||||||
private int currentSampleCount = 5; // 当前试样数量,可动态调整
|
private int currentSampleCount = 5; // 当前试样数量,可动态调整
|
||||||
private readonly Random random = new Random();
|
private readonly Random random = new Random();
|
||||||
|
private bool isVerticalLayout = true; // true=纵向(当前),false=横向
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
public Form3()
|
public Form3()
|
||||||
@@ -69,7 +70,7 @@ namespace WindowsFormsApp6
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 初始化 DataGridView 列 - 实现2级表头
|
/// 初始化 DataGridView 列 - 实现2级表头(纵向)或普通表头(横向)
|
||||||
/// </summary>
|
/// </summary>
|
||||||
private void InitializeDataGridView()
|
private void InitializeDataGridView()
|
||||||
{
|
{
|
||||||
@@ -91,49 +92,15 @@ namespace WindowsFormsApp6
|
|||||||
Alignment = DataGridViewContentAlignment.MiddleCenter
|
Alignment = DataGridViewContentAlignment.MiddleCenter
|
||||||
};
|
};
|
||||||
|
|
||||||
// 序号列
|
if (isVerticalLayout)
|
||||||
dataGridView1.Columns.Add(new DataGridViewTextBoxColumn
|
|
||||||
{
|
{
|
||||||
Name = "序号",
|
// 纵向布局:2级表头
|
||||||
HeaderText = "序号",
|
InitializeVerticalLayout(centerStyle);
|
||||||
DataPropertyName = "序号",
|
}
|
||||||
Width = 180,
|
else
|
||||||
ReadOnly = true,
|
|
||||||
DefaultCellStyle = centerStyle
|
|
||||||
});
|
|
||||||
|
|
||||||
// 为每个试样添加3列(2级表头:试样N + 子列1/2/3)
|
|
||||||
for (int i = 1; i <= currentSampleCount; i++)
|
|
||||||
{
|
{
|
||||||
dataGridView1.Columns.Add(new DataGridViewTextBoxColumn
|
// 横向布局:普通表头
|
||||||
{
|
InitializeHorizontalLayout(centerStyle);
|
||||||
Name = $"试样{i}_1",
|
|
||||||
HeaderText = $"试样{i}\n1",
|
|
||||||
DataPropertyName = $"试样{i}_1",
|
|
||||||
Width = 100,
|
|
||||||
ReadOnly = false,
|
|
||||||
DefaultCellStyle = (DataGridViewCellStyle)centerStyle.Clone()
|
|
||||||
});
|
|
||||||
|
|
||||||
dataGridView1.Columns.Add(new DataGridViewTextBoxColumn
|
|
||||||
{
|
|
||||||
Name = $"试样{i}_2",
|
|
||||||
HeaderText = $"试样{i}\n2",
|
|
||||||
DataPropertyName = $"试样{i}_2",
|
|
||||||
Width = 100,
|
|
||||||
ReadOnly = false,
|
|
||||||
DefaultCellStyle = (DataGridViewCellStyle)centerStyle.Clone()
|
|
||||||
});
|
|
||||||
|
|
||||||
dataGridView1.Columns.Add(new DataGridViewTextBoxColumn
|
|
||||||
{
|
|
||||||
Name = $"试样{i}_3",
|
|
||||||
HeaderText = $"试样{i}\n3",
|
|
||||||
DataPropertyName = $"试样{i}_3",
|
|
||||||
Width = 100,
|
|
||||||
ReadOnly = false,
|
|
||||||
DefaultCellStyle = (DataGridViewCellStyle)centerStyle.Clone()
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// 绑定数据源
|
// 绑定数据源
|
||||||
@@ -148,6 +115,125 @@ namespace WindowsFormsApp6
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 初始化纵向布局(当前默认布局)
|
||||||
|
/// </summary>
|
||||||
|
private void InitializeVerticalLayout(DataGridViewCellStyle centerStyle)
|
||||||
|
{
|
||||||
|
// 序号列
|
||||||
|
dataGridView1.Columns.Add(new DataGridViewTextBoxColumn
|
||||||
|
{
|
||||||
|
Name = "序号",
|
||||||
|
HeaderText = "序号",
|
||||||
|
DataPropertyName = "序号",
|
||||||
|
Width = 180,
|
||||||
|
ReadOnly = true,
|
||||||
|
DefaultCellStyle = centerStyle
|
||||||
|
});
|
||||||
|
|
||||||
|
// 为每个试样添加3列(2级表头:试样N + 子列1/2/3)
|
||||||
|
for (int i = 1; i <= currentSampleCount; i++)
|
||||||
|
{
|
||||||
|
dataGridView1.Columns.Add(new DataGridViewTextBoxColumn
|
||||||
|
{
|
||||||
|
Name = $"试样{i}_1",
|
||||||
|
HeaderText = $"试样{i}\n1",
|
||||||
|
DataPropertyName = $"试样{i}_1",
|
||||||
|
Width = 100,
|
||||||
|
ReadOnly = false,
|
||||||
|
DefaultCellStyle = (DataGridViewCellStyle)centerStyle.Clone()
|
||||||
|
});
|
||||||
|
|
||||||
|
dataGridView1.Columns.Add(new DataGridViewTextBoxColumn
|
||||||
|
{
|
||||||
|
Name = $"试样{i}_2",
|
||||||
|
HeaderText = $"试样{i}\n2",
|
||||||
|
DataPropertyName = $"试样{i}_2",
|
||||||
|
Width = 100,
|
||||||
|
ReadOnly = false,
|
||||||
|
DefaultCellStyle = (DataGridViewCellStyle)centerStyle.Clone()
|
||||||
|
});
|
||||||
|
|
||||||
|
dataGridView1.Columns.Add(new DataGridViewTextBoxColumn
|
||||||
|
{
|
||||||
|
Name = $"试样{i}_3",
|
||||||
|
HeaderText = $"试样{i}\n3",
|
||||||
|
DataPropertyName = $"试样{i}_3",
|
||||||
|
Width = 100,
|
||||||
|
ReadOnly = false,
|
||||||
|
DefaultCellStyle = (DataGridViewCellStyle)centerStyle.Clone()
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 初始化横向布局
|
||||||
|
/// </summary>
|
||||||
|
private void InitializeHorizontalLayout(DataGridViewCellStyle centerStyle)
|
||||||
|
{
|
||||||
|
// 序号列
|
||||||
|
dataGridView1.Columns.Add(new DataGridViewTextBoxColumn
|
||||||
|
{
|
||||||
|
Name = "序号",
|
||||||
|
HeaderText = "序号",
|
||||||
|
DataPropertyName = "序号",
|
||||||
|
Width = 120,
|
||||||
|
ReadOnly = true,
|
||||||
|
DefaultCellStyle = centerStyle
|
||||||
|
});
|
||||||
|
|
||||||
|
// 数据项列
|
||||||
|
dataGridView1.Columns.Add(new DataGridViewTextBoxColumn
|
||||||
|
{
|
||||||
|
Name = ROW_WICKING_TIME,
|
||||||
|
HeaderText = ROW_WICKING_TIME,
|
||||||
|
DataPropertyName = ROW_WICKING_TIME,
|
||||||
|
Width = 120,
|
||||||
|
ReadOnly = true,
|
||||||
|
DefaultCellStyle = (DataGridViewCellStyle)centerStyle.Clone()
|
||||||
|
});
|
||||||
|
|
||||||
|
dataGridView1.Columns.Add(new DataGridViewTextBoxColumn
|
||||||
|
{
|
||||||
|
Name = ROW_WICKING_HEIGHT,
|
||||||
|
HeaderText = ROW_WICKING_HEIGHT,
|
||||||
|
DataPropertyName = ROW_WICKING_HEIGHT,
|
||||||
|
Width = 120,
|
||||||
|
ReadOnly = false,
|
||||||
|
DefaultCellStyle = (DataGridViewCellStyle)centerStyle.Clone()
|
||||||
|
});
|
||||||
|
|
||||||
|
dataGridView1.Columns.Add(new DataGridViewTextBoxColumn
|
||||||
|
{
|
||||||
|
Name = ROW_WICKING_RATE,
|
||||||
|
HeaderText = ROW_WICKING_RATE,
|
||||||
|
DataPropertyName = ROW_WICKING_RATE,
|
||||||
|
Width = 140,
|
||||||
|
ReadOnly = true,
|
||||||
|
DefaultCellStyle = (DataGridViewCellStyle)centerStyle.Clone()
|
||||||
|
});
|
||||||
|
|
||||||
|
dataGridView1.Columns.Add(new DataGridViewTextBoxColumn
|
||||||
|
{
|
||||||
|
Name = ROW_AVG_WICKING_RATE,
|
||||||
|
HeaderText = ROW_AVG_WICKING_RATE,
|
||||||
|
DataPropertyName = ROW_AVG_WICKING_RATE,
|
||||||
|
Width = 160,
|
||||||
|
ReadOnly = true,
|
||||||
|
DefaultCellStyle = (DataGridViewCellStyle)centerStyle.Clone()
|
||||||
|
});
|
||||||
|
|
||||||
|
dataGridView1.Columns.Add(new DataGridViewTextBoxColumn
|
||||||
|
{
|
||||||
|
Name = ROW_STD_DEVIATION,
|
||||||
|
HeaderText = ROW_STD_DEVIATION,
|
||||||
|
DataPropertyName = ROW_STD_DEVIATION,
|
||||||
|
Width = 120,
|
||||||
|
ReadOnly = true,
|
||||||
|
DefaultCellStyle = (DataGridViewCellStyle)centerStyle.Clone()
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 单元格编辑前事件 - 动态控制哪些单元格可以编辑
|
/// 单元格编辑前事件 - 动态控制哪些单元格可以编辑
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -155,16 +241,30 @@ namespace WindowsFormsApp6
|
|||||||
{
|
{
|
||||||
if (e.RowIndex >= 0 && e.ColumnIndex > 0)
|
if (e.RowIndex >= 0 && e.ColumnIndex > 0)
|
||||||
{
|
{
|
||||||
string rowName = dataGridView1.Rows[e.RowIndex].Cells["序号"].Value?.ToString() ?? "";
|
if (isVerticalLayout)
|
||||||
|
|
||||||
// 吸芯高度(mm)行 - 所有列都可以编辑
|
|
||||||
if (rowName == ROW_WICKING_HEIGHT)
|
|
||||||
{
|
{
|
||||||
return; // 允许编辑
|
// 纵向布局:只有吸芯高度行可以编辑
|
||||||
}
|
string rowName = dataGridView1.Rows[e.RowIndex].Cells["序号"].Value?.ToString() ?? "";
|
||||||
|
|
||||||
// 其他行 - 取消编辑
|
if (rowName == ROW_WICKING_HEIGHT)
|
||||||
e.Cancel = true;
|
{
|
||||||
|
return; // 允许编辑
|
||||||
|
}
|
||||||
|
|
||||||
|
e.Cancel = true; // 其他行不可编辑
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// 横向布局:只有吸芯高度列可以编辑
|
||||||
|
string columnName = dataGridView1.Columns[e.ColumnIndex].Name;
|
||||||
|
|
||||||
|
if (columnName == ROW_WICKING_HEIGHT)
|
||||||
|
{
|
||||||
|
return; // 允许编辑
|
||||||
|
}
|
||||||
|
|
||||||
|
e.Cancel = true; // 其他列不可编辑
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -208,10 +308,22 @@ namespace WindowsFormsApp6
|
|||||||
{
|
{
|
||||||
if (e.RowIndex >= 0 && e.ColumnIndex >= 0)
|
if (e.RowIndex >= 0 && e.ColumnIndex >= 0)
|
||||||
{
|
{
|
||||||
string rowName = dataGridView1.Rows[e.RowIndex].Cells["序号"].Value?.ToString() ?? "";
|
bool shouldRecalculate = false;
|
||||||
|
|
||||||
// 如果是吸芯高度行,任何列的修改都触发重新计算
|
if (isVerticalLayout)
|
||||||
if (rowName == ROW_WICKING_HEIGHT)
|
{
|
||||||
|
// 纵向布局:检查是否是吸芯高度行
|
||||||
|
string rowName = dataGridView1.Rows[e.RowIndex].Cells["序号"].Value?.ToString() ?? "";
|
||||||
|
shouldRecalculate = (rowName == ROW_WICKING_HEIGHT);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// 横向布局:检查是否是吸芯高度列
|
||||||
|
string columnName = dataGridView1.Columns[e.ColumnIndex].Name;
|
||||||
|
shouldRecalculate = (columnName == ROW_WICKING_HEIGHT);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (shouldRecalculate)
|
||||||
{
|
{
|
||||||
CalculateAllRows();
|
CalculateAllRows();
|
||||||
RefreshDataGridView();
|
RefreshDataGridView();
|
||||||
@@ -236,6 +348,134 @@ namespace WindowsFormsApp6
|
|||||||
};
|
};
|
||||||
clockTimer.Tick += (s, e) => label2.Text = DateTime.Now.ToString(DATE_TIME_FORMAT);
|
clockTimer.Tick += (s, e) => label2.Text = DateTime.Now.ToString(DATE_TIME_FORMAT);
|
||||||
clockTimer.Start();
|
clockTimer.Start();
|
||||||
|
|
||||||
|
// 动态创建切换按钮
|
||||||
|
CreateToggleButton();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 创建切换按钮
|
||||||
|
/// </summary>
|
||||||
|
private void CreateToggleButton()
|
||||||
|
{
|
||||||
|
Button toggleButton = new Button
|
||||||
|
{
|
||||||
|
Name = "buttonToggle",
|
||||||
|
Text = "🔄 横向",
|
||||||
|
Width = 100,
|
||||||
|
Height = 30,
|
||||||
|
BackColor = Color.FromArgb(52, 152, 219),
|
||||||
|
ForeColor = Color.White,
|
||||||
|
FlatStyle = FlatStyle.Flat,
|
||||||
|
Font = new Font("微软雅黑", 9F, FontStyle.Bold),
|
||||||
|
Cursor = Cursors.Hand
|
||||||
|
};
|
||||||
|
|
||||||
|
toggleButton.FlatAppearance.BorderSize = 0;
|
||||||
|
toggleButton.Click += (s, e) =>
|
||||||
|
{
|
||||||
|
ToggleTableLayout();
|
||||||
|
toggleButton.Text = isVerticalLayout ? "🔄 横向" : "🔄 纵向";
|
||||||
|
};
|
||||||
|
|
||||||
|
// 将按钮添加到 panel2
|
||||||
|
if (this.Controls.Find("tableLayoutPanel1", true).FirstOrDefault() is TableLayoutPanel tlp1)
|
||||||
|
{
|
||||||
|
if (tlp1.Controls.Find("tableLayoutPanel2", true).FirstOrDefault() is TableLayoutPanel tlp2)
|
||||||
|
{
|
||||||
|
if (tlp2.Controls.Find("panel2", true).FirstOrDefault() is Panel panel2)
|
||||||
|
{
|
||||||
|
toggleButton.Location = new Point(panel2.Width - 120, 5);
|
||||||
|
toggleButton.Anchor = AnchorStyles.Top | AnchorStyles.Right;
|
||||||
|
panel2.Controls.Add(toggleButton);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 切换表格方向(纵向/横向)
|
||||||
|
/// </summary>
|
||||||
|
private void ToggleTableLayout()
|
||||||
|
{
|
||||||
|
isVerticalLayout = !isVerticalLayout;
|
||||||
|
|
||||||
|
// 保存当前数据
|
||||||
|
var currentData = SaveCurrentData();
|
||||||
|
|
||||||
|
// 重新初始化表格
|
||||||
|
InitializeDataTable();
|
||||||
|
InitializeDataGridView();
|
||||||
|
|
||||||
|
// 恢复数据
|
||||||
|
RestoreData(currentData);
|
||||||
|
|
||||||
|
// 更新显示
|
||||||
|
RefreshDataGridView();
|
||||||
|
|
||||||
|
ShowMessage($"已切换到{(isVerticalLayout ? "纵向" : "横向")}布局", "布局切换", MessageBoxIcon.Information);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 保存当前数据
|
||||||
|
/// </summary>
|
||||||
|
private Dictionary<string, Dictionary<string, double>> SaveCurrentData()
|
||||||
|
{
|
||||||
|
var data = new Dictionary<string, Dictionary<string, double>>();
|
||||||
|
|
||||||
|
if (sampleDataTable == null || sampleDataTable.Rows.Count == 0)
|
||||||
|
return data;
|
||||||
|
|
||||||
|
foreach (DataRow row in sampleDataTable.Rows)
|
||||||
|
{
|
||||||
|
string rowName = row["序号"]?.ToString() ?? "";
|
||||||
|
if (string.IsNullOrEmpty(rowName)) continue;
|
||||||
|
|
||||||
|
var rowData = new Dictionary<string, double>();
|
||||||
|
for (int i = 1; i <= currentSampleCount; i++)
|
||||||
|
{
|
||||||
|
for (int j = 1; j <= 3; j++)
|
||||||
|
{
|
||||||
|
string colName = $"试样{i}_{j}";
|
||||||
|
if (row.Table.Columns.Contains(colName))
|
||||||
|
{
|
||||||
|
rowData[colName] = ConvertToDouble(row[colName]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
data[rowName] = rowData;
|
||||||
|
}
|
||||||
|
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 恢复数据
|
||||||
|
/// </summary>
|
||||||
|
private void RestoreData(Dictionary<string, Dictionary<string, double>> data)
|
||||||
|
{
|
||||||
|
if (data == null || data.Count == 0 || sampleDataTable == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
foreach (DataRow row in sampleDataTable.Rows)
|
||||||
|
{
|
||||||
|
string rowName = row["序号"]?.ToString() ?? "";
|
||||||
|
if (string.IsNullOrEmpty(rowName) || !data.ContainsKey(rowName))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
var rowData = data[rowName];
|
||||||
|
for (int i = 1; i <= currentSampleCount; i++)
|
||||||
|
{
|
||||||
|
for (int j = 1; j <= 3; j++)
|
||||||
|
{
|
||||||
|
string colName = $"试样{i}_{j}";
|
||||||
|
if (row.Table.Columns.Contains(colName) && rowData.ContainsKey(colName))
|
||||||
|
{
|
||||||
|
row[colName] = rowData[colName];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -323,23 +563,52 @@ namespace WindowsFormsApp6
|
|||||||
{
|
{
|
||||||
sampleDataTable = new DataTable();
|
sampleDataTable = new DataTable();
|
||||||
|
|
||||||
// 序号列
|
if (isVerticalLayout)
|
||||||
sampleDataTable.Columns.Add("序号", typeof(string));
|
|
||||||
|
|
||||||
// 为每个试样添加3列(试样次数:1、2、3)
|
|
||||||
for (int i = 1; i <= currentSampleCount; i++)
|
|
||||||
{
|
{
|
||||||
sampleDataTable.Columns.Add($"试样{i}_1", typeof(double));
|
// 纵向布局:序号列 + 试样列
|
||||||
sampleDataTable.Columns.Add($"试样{i}_2", typeof(double));
|
sampleDataTable.Columns.Add("序号", typeof(string));
|
||||||
sampleDataTable.Columns.Add($"试样{i}_3", typeof(double));
|
|
||||||
}
|
|
||||||
|
|
||||||
// 初始化5行数据
|
// 为每个试样添加3列(试样次数:1、2、3)
|
||||||
AddDataRow(ROW_WICKING_TIME);
|
for (int i = 1; i <= currentSampleCount; i++)
|
||||||
AddDataRow(ROW_WICKING_HEIGHT);
|
{
|
||||||
AddDataRow(ROW_WICKING_RATE);
|
sampleDataTable.Columns.Add($"试样{i}_1", typeof(double));
|
||||||
AddDataRow(ROW_AVG_WICKING_RATE);
|
sampleDataTable.Columns.Add($"试样{i}_2", typeof(double));
|
||||||
AddDataRow(ROW_STD_DEVIATION);
|
sampleDataTable.Columns.Add($"试样{i}_3", typeof(double));
|
||||||
|
}
|
||||||
|
|
||||||
|
// 初始化5行数据
|
||||||
|
AddDataRow(ROW_WICKING_TIME);
|
||||||
|
AddDataRow(ROW_WICKING_HEIGHT);
|
||||||
|
AddDataRow(ROW_WICKING_RATE);
|
||||||
|
AddDataRow(ROW_AVG_WICKING_RATE);
|
||||||
|
AddDataRow(ROW_STD_DEVIATION);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// 横向布局:序号列 + 数据项列
|
||||||
|
sampleDataTable.Columns.Add("序号", typeof(string));
|
||||||
|
sampleDataTable.Columns.Add(ROW_WICKING_TIME, typeof(double));
|
||||||
|
sampleDataTable.Columns.Add(ROW_WICKING_HEIGHT, typeof(double));
|
||||||
|
sampleDataTable.Columns.Add(ROW_WICKING_RATE, typeof(double));
|
||||||
|
sampleDataTable.Columns.Add(ROW_AVG_WICKING_RATE, typeof(double));
|
||||||
|
sampleDataTable.Columns.Add(ROW_STD_DEVIATION, typeof(double));
|
||||||
|
|
||||||
|
// 为每个试样的每次测试添加一行
|
||||||
|
for (int i = 1; i <= currentSampleCount; i++)
|
||||||
|
{
|
||||||
|
for (int j = 1; j <= 3; j++)
|
||||||
|
{
|
||||||
|
DataRow row = sampleDataTable.NewRow();
|
||||||
|
row["序号"] = $"试样{i}_{j}";
|
||||||
|
row[ROW_WICKING_TIME] = 0.0;
|
||||||
|
row[ROW_WICKING_HEIGHT] = 0.0;
|
||||||
|
row[ROW_WICKING_RATE] = 0.0;
|
||||||
|
row[ROW_AVG_WICKING_RATE] = 0.0;
|
||||||
|
row[ROW_STD_DEVIATION] = 0.0;
|
||||||
|
sampleDataTable.Rows.Add(row);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -376,19 +645,41 @@ namespace WindowsFormsApp6
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
private void DataTimer_Tick(object sender, EventArgs e)
|
private void DataTimer_Tick(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
// 第1行:读取吸水时间(s) - 从寄存器读取(每个试样读取3次)
|
if (isVerticalLayout)
|
||||||
DataRow timeRow = sampleDataTable.Rows[0];
|
|
||||||
for (int i = 1; i <= currentSampleCount; i++)
|
|
||||||
{
|
{
|
||||||
double time1 = ReadRegisterData((i - 1) * 3); // 第1次测试
|
// 纵向布局:第1行读取吸水时间
|
||||||
double time2 = ReadRegisterData((i - 1) * 3 + 1); // 第2次测试
|
DataRow timeRow = sampleDataTable.Rows[0];
|
||||||
double time3 = ReadRegisterData((i - 1) * 3 + 2); // 第3次测试
|
for (int i = 1; i <= currentSampleCount; i++)
|
||||||
|
{
|
||||||
|
double time1 = ReadRegisterData((i - 1) * 3);
|
||||||
|
double time2 = ReadRegisterData((i - 1) * 3 + 1);
|
||||||
|
double time3 = ReadRegisterData((i - 1) * 3 + 2);
|
||||||
|
|
||||||
timeRow[$"试样{i}_1"] = time1;
|
timeRow[$"试样{i}_1"] = time1;
|
||||||
timeRow[$"试样{i}_2"] = time2;
|
timeRow[$"试样{i}_2"] = time2;
|
||||||
timeRow[$"试样{i}_3"] = time3;
|
timeRow[$"试样{i}_3"] = time3;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// 横向布局:每行读取吸水时间
|
||||||
|
int rowIndex = 0;
|
||||||
|
for (int i = 1; i <= currentSampleCount; i++)
|
||||||
|
{
|
||||||
|
for (int j = 1; j <= 3; j++)
|
||||||
|
{
|
||||||
|
if (rowIndex < sampleDataTable.Rows.Count)
|
||||||
|
{
|
||||||
|
double time = ReadRegisterData((i - 1) * 3 + (j - 1));
|
||||||
|
sampleDataTable.Rows[rowIndex][ROW_WICKING_TIME] = time;
|
||||||
|
rowIndex++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 计算所有相关数据
|
||||||
|
CalculateAllRows();
|
||||||
UpdateDisplay();
|
UpdateDisplay();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -409,34 +700,49 @@ namespace WindowsFormsApp6
|
|||||||
// 清空所有行的数据(保持表结构)
|
// 清空所有行的数据(保持表结构)
|
||||||
foreach (DataRow row in sampleDataTable.Rows)
|
foreach (DataRow row in sampleDataTable.Rows)
|
||||||
{
|
{
|
||||||
for (int i = 1; i <= currentSampleCount; i++)
|
for (int colIndex = 1; colIndex < sampleDataTable.Columns.Count; colIndex++)
|
||||||
{
|
{
|
||||||
row[$"试样{i}_1"] = 0.0;
|
row[colIndex] = 0.0;
|
||||||
row[$"试样{i}_2"] = 0.0;
|
|
||||||
row[$"试样{i}_3"] = 0.0;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 第1行:吸水时间(s)- 系统读数(每个试样3次)
|
if (isVerticalLayout)
|
||||||
DataRow timeRow = sampleDataTable.Rows[0];
|
|
||||||
for (int i = 1; i <= currentSampleCount; i++)
|
|
||||||
{
|
{
|
||||||
// 生成3次测试的吸水时间数据(30-34秒,略有差异)
|
// 纵向布局:第1行生成吸水时间
|
||||||
double baseTime = 31 + random.NextDouble() * 2; // 基准时间 31-33秒
|
DataRow timeRow = sampleDataTable.Rows[0];
|
||||||
double time1 = Math.Round(baseTime + (random.NextDouble() - 0.5) * 2, 2); // ±1秒
|
for (int i = 1; i <= currentSampleCount; i++)
|
||||||
double time2 = Math.Round(baseTime + (random.NextDouble() - 0.5) * 2, 2);
|
{
|
||||||
double time3 = Math.Round(baseTime + (random.NextDouble() - 0.5) * 2, 2);
|
double baseTime = 31 + random.NextDouble() * 2;
|
||||||
|
double time1 = Math.Round(baseTime + (random.NextDouble() - 0.5) * 2, 2);
|
||||||
|
double time2 = Math.Round(baseTime + (random.NextDouble() - 0.5) * 2, 2);
|
||||||
|
double time3 = Math.Round(baseTime + (random.NextDouble() - 0.5) * 2, 2);
|
||||||
|
|
||||||
timeRow[$"试样{i}_1"] = time1;
|
timeRow[$"试样{i}_1"] = time1;
|
||||||
timeRow[$"试样{i}_2"] = time2;
|
timeRow[$"试样{i}_2"] = time2;
|
||||||
timeRow[$"试样{i}_3"] = time3;
|
timeRow[$"试样{i}_3"] = time3;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// 横向布局:每行生成吸水时间
|
||||||
|
int rowIndex = 0;
|
||||||
|
for (int i = 1; i <= currentSampleCount; i++)
|
||||||
|
{
|
||||||
|
double baseTime = 31 + random.NextDouble() * 2;
|
||||||
|
for (int j = 1; j <= 3; j++)
|
||||||
|
{
|
||||||
|
if (rowIndex < sampleDataTable.Rows.Count)
|
||||||
|
{
|
||||||
|
double time = Math.Round(baseTime + (random.NextDouble() - 0.5) * 2, 2);
|
||||||
|
sampleDataTable.Rows[rowIndex][ROW_WICKING_TIME] = time;
|
||||||
|
rowIndex++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 第2行:吸芯高度(mm)- 手动输入,不自动生成
|
// 计算所有相关数据
|
||||||
// 保持为0,等待用户手动输入
|
CalculateAllRows();
|
||||||
|
|
||||||
// 第3-5行:芯吸速率、平均值、标准偏差 - 保持为0
|
|
||||||
// 等待用户输入吸芯高度后,会自动计算
|
|
||||||
|
|
||||||
// 更新显示
|
// 更新显示
|
||||||
RefreshDataGridView();
|
RefreshDataGridView();
|
||||||
@@ -489,31 +795,42 @@ namespace WindowsFormsApp6
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
private void CalculateWickingRate()
|
private void CalculateWickingRate()
|
||||||
{
|
{
|
||||||
DataRow timeRow = sampleDataTable.Rows[0]; // 吸水时间
|
if (isVerticalLayout)
|
||||||
DataRow heightRow = sampleDataTable.Rows[1]; // 吸芯高度
|
|
||||||
DataRow rateRow = sampleDataTable.Rows[2]; // 芯吸速率
|
|
||||||
|
|
||||||
for (int i = 1; i <= currentSampleCount; i++)
|
|
||||||
{
|
{
|
||||||
// 获取3次吸水时间测试数据
|
// 纵向布局
|
||||||
double time1 = ConvertToDouble(timeRow[$"试样{i}_1"]);
|
DataRow timeRow = sampleDataTable.Rows[0];
|
||||||
double time2 = ConvertToDouble(timeRow[$"试样{i}_2"]);
|
DataRow heightRow = sampleDataTable.Rows[1];
|
||||||
double time3 = ConvertToDouble(timeRow[$"试样{i}_3"]);
|
DataRow rateRow = sampleDataTable.Rows[2];
|
||||||
|
|
||||||
// 获取3次吸芯高度测试数据
|
for (int i = 1; i <= currentSampleCount; i++)
|
||||||
double height1 = ConvertToDouble(heightRow[$"试样{i}_1"]);
|
{
|
||||||
double height2 = ConvertToDouble(heightRow[$"试样{i}_2"]);
|
double time1 = ConvertToDouble(timeRow[$"试样{i}_1"]);
|
||||||
double height3 = ConvertToDouble(heightRow[$"试样{i}_3"]);
|
double time2 = ConvertToDouble(timeRow[$"试样{i}_2"]);
|
||||||
|
double time3 = ConvertToDouble(timeRow[$"试样{i}_3"]);
|
||||||
|
|
||||||
// 计算3次芯吸速率(每次测试独立计算,使用对应的时间和高度)
|
double height1 = ConvertToDouble(heightRow[$"试样{i}_1"]);
|
||||||
double rate1 = (time1 > 0 && height1 > 0) ? height1 / (time1 / 60.0) : 0;
|
double height2 = ConvertToDouble(heightRow[$"试样{i}_2"]);
|
||||||
double rate2 = (time2 > 0 && height2 > 0) ? height2 / (time2 / 60.0) : 0;
|
double height3 = ConvertToDouble(heightRow[$"试样{i}_3"]);
|
||||||
double rate3 = (time3 > 0 && height3 > 0) ? height3 / (time3 / 60.0) : 0;
|
|
||||||
|
|
||||||
// 存储到对应的列
|
double rate1 = (time1 > 0 && height1 > 0) ? height1 / (time1 / 60.0) : 0;
|
||||||
rateRow[$"试样{i}_1"] = Math.Round(rate1, 2);
|
double rate2 = (time2 > 0 && height2 > 0) ? height2 / (time2 / 60.0) : 0;
|
||||||
rateRow[$"试样{i}_2"] = Math.Round(rate2, 2);
|
double rate3 = (time3 > 0 && height3 > 0) ? height3 / (time3 / 60.0) : 0;
|
||||||
rateRow[$"试样{i}_3"] = Math.Round(rate3, 2);
|
|
||||||
|
rateRow[$"试样{i}_1"] = Math.Round(rate1, 2);
|
||||||
|
rateRow[$"试样{i}_2"] = Math.Round(rate2, 2);
|
||||||
|
rateRow[$"试样{i}_3"] = Math.Round(rate3, 2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// 横向布局
|
||||||
|
foreach (DataRow row in sampleDataTable.Rows)
|
||||||
|
{
|
||||||
|
double time = ConvertToDouble(row[ROW_WICKING_TIME]);
|
||||||
|
double height = ConvertToDouble(row[ROW_WICKING_HEIGHT]);
|
||||||
|
double rate = (time > 0 && height > 0) ? height / (time / 60.0) : 0;
|
||||||
|
row[ROW_WICKING_RATE] = Math.Round(rate, 2);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -540,25 +857,63 @@ namespace WindowsFormsApp6
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
private void CalculateAverageWickingRate()
|
private void CalculateAverageWickingRate()
|
||||||
{
|
{
|
||||||
DataRow rateRow = sampleDataTable.Rows[2]; // 芯吸速率
|
|
||||||
DataRow avgRow = sampleDataTable.Rows[3]; // 平均芯吸速率
|
|
||||||
|
|
||||||
List<double> rates = new List<double>();
|
List<double> rates = new List<double>();
|
||||||
for (int i = 1; i <= currentSampleCount; i++)
|
|
||||||
|
if (isVerticalLayout)
|
||||||
{
|
{
|
||||||
double rate = ConvertToDouble(rateRow[$"试样{i}_3"]);
|
// 纵向布局
|
||||||
if (rate > 0)
|
DataRow rateRow = sampleDataTable.Rows[2];
|
||||||
|
DataRow avgRow = sampleDataTable.Rows[3];
|
||||||
|
|
||||||
|
for (int i = 1; i <= currentSampleCount; i++)
|
||||||
{
|
{
|
||||||
rates.Add(rate);
|
double rate1 = ConvertToDouble(rateRow[$"试样{i}_1"]);
|
||||||
|
double rate2 = ConvertToDouble(rateRow[$"试样{i}_2"]);
|
||||||
|
double rate3 = ConvertToDouble(rateRow[$"试样{i}_3"]);
|
||||||
|
|
||||||
|
if (rate1 > 0) rates.Add(rate1);
|
||||||
|
if (rate2 > 0) rates.Add(rate2);
|
||||||
|
if (rate3 > 0) rates.Add(rate3);
|
||||||
|
}
|
||||||
|
|
||||||
|
double average = rates.Count > 0 ? rates.Average() : 0;
|
||||||
|
|
||||||
|
for (int i = 1; i <= currentSampleCount; i++)
|
||||||
|
{
|
||||||
|
avgRow[$"试样{i}_3"] = Math.Round(average, 2);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else
|
||||||
double average = rates.Count > 0 ? rates.Average() : 0;
|
|
||||||
|
|
||||||
// 所有试样显示相同的平均值(存储在试样次数3)
|
|
||||||
for (int i = 1; i <= currentSampleCount; i++)
|
|
||||||
{
|
{
|
||||||
avgRow[$"试样{i}_3"] = Math.Round(average, 2);
|
// 横向布局
|
||||||
|
foreach (DataRow row in sampleDataTable.Rows)
|
||||||
|
{
|
||||||
|
double rate = ConvertToDouble(row[ROW_WICKING_RATE]);
|
||||||
|
if (rate > 0) rates.Add(rate);
|
||||||
|
}
|
||||||
|
|
||||||
|
double average = rates.Count > 0 ? rates.Average() : 0;
|
||||||
|
|
||||||
|
// 只在每个试样的第3次测试显示平均值
|
||||||
|
int rowIndex = 0;
|
||||||
|
for (int i = 1; i <= currentSampleCount; i++)
|
||||||
|
{
|
||||||
|
for (int j = 1; j <= 3; j++)
|
||||||
|
{
|
||||||
|
if (rowIndex < sampleDataTable.Rows.Count)
|
||||||
|
{
|
||||||
|
if (j == 3)
|
||||||
|
{
|
||||||
|
sampleDataTable.Rows[rowIndex][ROW_AVG_WICKING_RATE] = Math.Round(average, 2);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
sampleDataTable.Rows[rowIndex][ROW_AVG_WICKING_RATE] = 0.0;
|
||||||
|
}
|
||||||
|
rowIndex++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -567,31 +922,75 @@ namespace WindowsFormsApp6
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
private void CalculateStandardDeviation()
|
private void CalculateStandardDeviation()
|
||||||
{
|
{
|
||||||
DataRow rateRow = sampleDataTable.Rows[2]; // 芯吸速率
|
|
||||||
DataRow stdRow = sampleDataTable.Rows[4]; // 标准偏差
|
|
||||||
|
|
||||||
List<double> rates = new List<double>();
|
List<double> rates = new List<double>();
|
||||||
for (int i = 1; i <= currentSampleCount; i++)
|
|
||||||
|
if (isVerticalLayout)
|
||||||
{
|
{
|
||||||
double rate = ConvertToDouble(rateRow[$"试样{i}_3"]);
|
// 纵向布局
|
||||||
if (rate > 0)
|
DataRow rateRow = sampleDataTable.Rows[2];
|
||||||
|
DataRow stdRow = sampleDataTable.Rows[4];
|
||||||
|
|
||||||
|
for (int i = 1; i <= currentSampleCount; i++)
|
||||||
{
|
{
|
||||||
rates.Add(rate);
|
double rate1 = ConvertToDouble(rateRow[$"试样{i}_1"]);
|
||||||
|
double rate2 = ConvertToDouble(rateRow[$"试样{i}_2"]);
|
||||||
|
double rate3 = ConvertToDouble(rateRow[$"试样{i}_3"]);
|
||||||
|
|
||||||
|
if (rate1 > 0) rates.Add(rate1);
|
||||||
|
if (rate2 > 0) rates.Add(rate2);
|
||||||
|
if (rate3 > 0) rates.Add(rate3);
|
||||||
|
}
|
||||||
|
|
||||||
|
double stdDev = 0;
|
||||||
|
if (rates.Count > 1)
|
||||||
|
{
|
||||||
|
double average = rates.Average();
|
||||||
|
double sumOfSquares = rates.Sum(r => Math.Pow(r - average, 2));
|
||||||
|
stdDev = Math.Sqrt(sumOfSquares / (rates.Count - 1));
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = 1; i <= currentSampleCount; i++)
|
||||||
|
{
|
||||||
|
stdRow[$"试样{i}_3"] = Math.Round(stdDev, 2);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else
|
||||||
double stdDev = 0;
|
|
||||||
if (rates.Count > 1)
|
|
||||||
{
|
{
|
||||||
double average = rates.Average();
|
// 横向布局
|
||||||
double sumOfSquares = rates.Sum(r => Math.Pow(r - average, 2));
|
foreach (DataRow row in sampleDataTable.Rows)
|
||||||
stdDev = Math.Sqrt(sumOfSquares / (rates.Count - 1));
|
{
|
||||||
}
|
double rate = ConvertToDouble(row[ROW_WICKING_RATE]);
|
||||||
|
if (rate > 0) rates.Add(rate);
|
||||||
|
}
|
||||||
|
|
||||||
// 所有试样显示相同的标准偏差(存储在试样次数3)
|
double stdDev = 0;
|
||||||
for (int i = 1; i <= currentSampleCount; i++)
|
if (rates.Count > 1)
|
||||||
{
|
{
|
||||||
stdRow[$"试样{i}_3"] = Math.Round(stdDev, 2);
|
double average = rates.Average();
|
||||||
|
double sumOfSquares = rates.Sum(r => Math.Pow(r - average, 2));
|
||||||
|
stdDev = Math.Sqrt(sumOfSquares / (rates.Count - 1));
|
||||||
|
}
|
||||||
|
|
||||||
|
// 只在每个试样的第3次测试显示标准偏差
|
||||||
|
int rowIndex = 0;
|
||||||
|
for (int i = 1; i <= currentSampleCount; i++)
|
||||||
|
{
|
||||||
|
for (int j = 1; j <= 3; j++)
|
||||||
|
{
|
||||||
|
if (rowIndex < sampleDataTable.Rows.Count)
|
||||||
|
{
|
||||||
|
if (j == 3)
|
||||||
|
{
|
||||||
|
sampleDataTable.Rows[rowIndex][ROW_STD_DEVIATION] = Math.Round(stdDev, 2);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
sampleDataTable.Rows[rowIndex][ROW_STD_DEVIATION] = 0.0;
|
||||||
|
}
|
||||||
|
rowIndex++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user