更新
This commit is contained in:
@@ -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++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user