This commit is contained in:
GukSang.Jin
2025-12-31 14:41:38 +08:00
parent 1c0d725886
commit 93e040e7ae

View File

@@ -37,6 +37,7 @@ namespace WindowsFormsApp6
private DataTable sampleDataTable;
private int currentSampleCount = 5; // 当前试样数量,可动态调整
private readonly Random random = new Random();
private bool isVerticalLayout = true; // true=纵向当前false=横向
#endregion
public Form3()
@@ -69,7 +70,7 @@ namespace WindowsFormsApp6
}
/// <summary>
/// 初始化 DataGridView 列 - 实现2级表头
/// 初始化 DataGridView 列 - 实现2级表头(纵向)或普通表头(横向)
/// </summary>
private void InitializeDataGridView()
{
@@ -91,49 +92,15 @@ namespace WindowsFormsApp6
Alignment = DataGridViewContentAlignment.MiddleCenter
};
// 序号列
dataGridView1.Columns.Add(new DataGridViewTextBoxColumn
if (isVerticalLayout)
{
Name = "序号",
HeaderText = "序号",
DataPropertyName = "序号",
Width = 180,
ReadOnly = true,
DefaultCellStyle = centerStyle
});
// 为每个试样添加3列2级表头试样N + 子列1/2/3
for (int i = 1; i <= currentSampleCount; i++)
// 纵向布局2级表头
InitializeVerticalLayout(centerStyle);
}
else
{
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()
});
// 横向布局:普通表头
InitializeHorizontalLayout(centerStyle);
}
// 绑定数据源
@@ -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>
@@ -155,16 +241,30 @@ namespace WindowsFormsApp6
{
if (e.RowIndex >= 0 && e.ColumnIndex > 0)
{
string rowName = dataGridView1.Rows[e.RowIndex].Cells["序号"].Value?.ToString() ?? "";
// 吸芯高度(mm)行 - 所有列都可以编辑
if (rowName == ROW_WICKING_HEIGHT)
if (isVerticalLayout)
{
return; // 允许编辑
// 纵向布局:只有吸芯高度行可以编辑
string rowName = dataGridView1.Rows[e.RowIndex].Cells["序号"].Value?.ToString() ?? "";
if (rowName == ROW_WICKING_HEIGHT)
{
return; // 允许编辑
}
e.Cancel = true; // 其他行不可编辑
}
else
{
// 横向布局:只有吸芯高度列可以编辑
string columnName = dataGridView1.Columns[e.ColumnIndex].Name;
if (columnName == ROW_WICKING_HEIGHT)
{
return; // 允许编辑
}
e.Cancel = true; // 其他列不可编辑
}
// 其他行 - 取消编辑
e.Cancel = true;
}
}
@@ -208,10 +308,22 @@ namespace WindowsFormsApp6
{
if (e.RowIndex >= 0 && e.ColumnIndex >= 0)
{
string rowName = dataGridView1.Rows[e.RowIndex].Cells["序号"].Value?.ToString() ?? "";
bool shouldRecalculate = false;
// 如果是吸芯高度行,任何列的修改都触发重新计算
if (rowName == ROW_WICKING_HEIGHT)
if (isVerticalLayout)
{
// 纵向布局:检查是否是吸芯高度行
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();
RefreshDataGridView();
@@ -236,6 +348,134 @@ namespace WindowsFormsApp6
};
clockTimer.Tick += (s, e) => label2.Text = DateTime.Now.ToString(DATE_TIME_FORMAT);
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>
@@ -323,23 +563,52 @@ namespace WindowsFormsApp6
{
sampleDataTable = new DataTable();
// 序号列
sampleDataTable.Columns.Add("序号", typeof(string));
// 为每个试样添加3列试样次数1、2、3
for (int i = 1; i <= currentSampleCount; i++)
if (isVerticalLayout)
{
sampleDataTable.Columns.Add($"试样{i}_1", typeof(double));
sampleDataTable.Columns.Add($"试样{i}_2", typeof(double));
sampleDataTable.Columns.Add($"试样{i}_3", typeof(double));
}
// 纵向布局:序号列 + 试样列
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($"试样{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);
// 初始化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>
@@ -376,19 +645,41 @@ namespace WindowsFormsApp6
/// </summary>
private void DataTimer_Tick(object sender, EventArgs e)
{
// 第1行读取吸水时间(s) - 从寄存器读取每个试样读取3次
DataRow timeRow = sampleDataTable.Rows[0];
for (int i = 1; i <= currentSampleCount; i++)
if (isVerticalLayout)
{
double time1 = ReadRegisterData((i - 1) * 3); // 第1次测试
double time2 = ReadRegisterData((i - 1) * 3 + 1); // 第2次测试
double time3 = ReadRegisterData((i - 1) * 3 + 2); // 第3次测试
timeRow[$"试样{i}_1"] = time1;
timeRow[$"试样{i}_2"] = time2;
timeRow[$"试样{i}_3"] = time3;
// 纵向布局第1行读取吸水时间
DataRow timeRow = sampleDataTable.Rows[0];
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}_2"] = time2;
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();
}
@@ -409,35 +700,50 @@ namespace WindowsFormsApp6
// 清空所有行的数据(保持表结构)
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[$"试样{i}_2"] = 0.0;
row[$"试样{i}_3"] = 0.0;
row[colIndex] = 0.0;
}
}
// 第1行吸水时间s- 系统读数每个试样3次
DataRow timeRow = sampleDataTable.Rows[0];
for (int i = 1; i <= currentSampleCount; i++)
if (isVerticalLayout)
{
// 生成3次测试的吸水时间数据30-34秒略有差异
double baseTime = 31 + random.NextDouble() * 2; // 基准时间 31-33秒
double time1 = Math.Round(baseTime + (random.NextDouble() - 0.5) * 2, 2); // ±1秒
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}_2"] = time2;
timeRow[$"试样{i}_3"] = time3;
// 纵向布局第1行生成吸水时间
DataRow timeRow = sampleDataTable.Rows[0];
for (int i = 1; i <= currentSampleCount; i++)
{
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}_2"] = time2;
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等待用户手动输入
// 第3-5行芯吸速率、平均值、标准偏差 - 保持为0
// 等待用户输入吸芯高度后,会自动计算
// 计算所有相关数据
CalculateAllRows();
// 更新显示
RefreshDataGridView();
@@ -489,31 +795,42 @@ namespace WindowsFormsApp6
/// </summary>
private void CalculateWickingRate()
{
DataRow timeRow = sampleDataTable.Rows[0]; // 吸水时间
DataRow heightRow = sampleDataTable.Rows[1]; // 吸芯高度
DataRow rateRow = sampleDataTable.Rows[2]; // 芯吸速率
for (int i = 1; i <= currentSampleCount; i++)
if (isVerticalLayout)
{
// 获取3次吸水时间测试数据
double time1 = ConvertToDouble(timeRow[$"试样{i}_1"]);
double time2 = ConvertToDouble(timeRow[$"试样{i}_2"]);
double time3 = ConvertToDouble(timeRow[$"试样{i}_3"]);
// 纵向布局
DataRow timeRow = sampleDataTable.Rows[0];
DataRow heightRow = sampleDataTable.Rows[1];
DataRow rateRow = sampleDataTable.Rows[2];
// 获取3次吸芯高度测试数据
double height1 = ConvertToDouble(heightRow[$"试样{i}_1"]);
double height2 = ConvertToDouble(heightRow[$"试样{i}_2"]);
double height3 = ConvertToDouble(heightRow[$"试样{i}_3"]);
for (int i = 1; i <= currentSampleCount; i++)
{
double time1 = ConvertToDouble(timeRow[$"试样{i}_1"]);
double time2 = ConvertToDouble(timeRow[$"试样{i}_2"]);
double time3 = ConvertToDouble(timeRow[$"试样{i}_3"]);
// 计算3次芯吸速率每次测试独立计算使用对应的时间和高度
double rate1 = (time1 > 0 && height1 > 0) ? height1 / (time1 / 60.0) : 0;
double rate2 = (time2 > 0 && height2 > 0) ? height2 / (time2 / 60.0) : 0;
double rate3 = (time3 > 0 && height3 > 0) ? height3 / (time3 / 60.0) : 0;
double height1 = ConvertToDouble(heightRow[$"试样{i}_1"]);
double height2 = ConvertToDouble(heightRow[$"试样{i}_2"]);
double height3 = ConvertToDouble(heightRow[$"试样{i}_3"]);
// 存储到对应的列
rateRow[$"试样{i}_1"] = Math.Round(rate1, 2);
rateRow[$"试样{i}_2"] = Math.Round(rate2, 2);
rateRow[$"试样{i}_3"] = Math.Round(rate3, 2);
double rate1 = (time1 > 0 && height1 > 0) ? height1 / (time1 / 60.0) : 0;
double rate2 = (time2 > 0 && height2 > 0) ? height2 / (time2 / 60.0) : 0;
double rate3 = (time3 > 0 && height3 > 0) ? height3 / (time3 / 60.0) : 0;
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>
private void CalculateAverageWickingRate()
{
DataRow rateRow = sampleDataTable.Rows[2]; // 芯吸速率
DataRow avgRow = sampleDataTable.Rows[3]; // 平均芯吸速率
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);
}
}
double average = rates.Count > 0 ? rates.Average() : 0;
// 所有试样显示相同的平均值存储在试样次数3
for (int i = 1; i <= currentSampleCount; i++)
else
{
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>
private void CalculateStandardDeviation()
{
DataRow rateRow = sampleDataTable.Rows[2]; // 芯吸速率
DataRow stdRow = sampleDataTable.Rows[4]; // 标准偏差
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);
}
}
double stdDev = 0;
if (rates.Count > 1)
else
{
double average = rates.Average();
double sumOfSquares = rates.Sum(r => Math.Pow(r - average, 2));
stdDev = Math.Sqrt(sumOfSquares / (rates.Count - 1));
}
// 横向布局
foreach (DataRow row in sampleDataTable.Rows)
{
double rate = ConvertToDouble(row[ROW_WICKING_RATE]);
if (rate > 0) rates.Add(rate);
}
// 所有试样显示相同的标准偏差存储在试样次数3
for (int i = 1; i <= currentSampleCount; i++)
{
stdRow[$"试样{i}_3"] = Math.Round(stdDev, 2);
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));
}
// 只在每个试样的第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++;
}
}
}
}
}