如何用for循环实现C#计算器填充3×4文本框表格?
问题描述
我要做一个C#计算器,用来填充一个3行4列的文本框表格。每行用不同变量计算,需要以WP为循环变量循环4次。目前已经实现了单列文本框的填充,但在for循环里没法动态对应不同列的文本框,试过用String.Format拼接控件名称的方法但没成功,求高效的实现方式。
现有可运行的单列填充代码
double var1 = Convert.ToDouble(tb_value1.Text, CultureInfo.InvariantCulture); double var2 = Convert.ToDouble(tb_value2.Text, CultureInfo.InvariantCulture); double var3 = Convert.ToDouble(tb_value3.Text, CultureInfo.InvariantCulture); int WP = 1; var S1 = Math.Pow((var2 - var1) * WP, 2); var S2 = Math.Pow(4 + var3, 2); var S3 = Math.Pow(var1, 2); var Calc1 = (S1 * (var2 / 3)); var Calc2 = (S1 * S3) / WP; var Calc3 = var3 + var1 * (S2 / WP); textBox11.Text = Calc1.ToString(CultureInfo.CreateSpecificCulture("en-GB")); textBox12.Text = Calc2.ToString(CultureInfo.CreateSpecificCulture("en-GB")); textBox13.Text = Calc3.ToString(CultureInfo.CreateSpecificCulture("en-GB"));
尝试的循环代码
double var1 = Convert.ToDouble(tb_value1.Text, CultureInfo.InvariantCulture); double var2 = Convert.ToDouble(tb_value2.Text, CultureInfo.InvariantCulture); double var3 = Convert.ToDouble(tb_value3.Text, CultureInfo.InvariantCulture); for ( WP = 1; WP <= 4; WP++) { var S1 = Math.Pow((var2 - var1) * WP, 2); var S2 = Math.Pow(4 + var3, 2); var S3 = Math.Pow(var1, 2); var Calc1 = (S1 * (var2 / 3)); var Calc2 = (S1 * S3) / WP; var Calc3 = var3 + var1 * (S2 / WP); textBox11.Text = Calc1.ToString(CultureInfo.CreateSpecificCulture("en-GB")); textBox12.Text = Calc2.ToString(CultureInfo.CreateSpecificCulture("en-GB")); textBox13.Text = Calc3.ToString(CultureInfo.CreateSpecificCulture("en-GB")); }
解决方案
方法1:提前定义控件数组(最直接高效)
把对应列的文本框按顺序存入二维数组,循环时根据WP的数值直接取对应列的控件组。假设文本框命名规则为textBox[列号][行号](比如第1列3行是textBox11、textBox12、textBox13,第2列是textBox21、textBox22、textBox23):
// 初始化控件数组,按列分组,每组对应一列的3个文本框 TextBox[][] columnTextBoxes = new TextBox[][] { new TextBox[] { textBox11, textBox12, textBox13 }, new TextBox[] { textBox21, textBox22, textBox23 }, new TextBox[] { textBox31, textBox32, textBox33 }, new TextBox[] { textBox41, textBox42, textBox43 } }; double var1 = Convert.ToDouble(tb_value1.Text, CultureInfo.InvariantCulture); double var2 = Convert.ToDouble(tb_value2.Text, CultureInfo.InvariantCulture); double var3 = Convert.ToDouble(tb_value3.Text, CultureInfo.InvariantCulture); for (int WP = 1; WP <= 4; WP++) { var S1 = Math.Pow((var2 - var1) * WP, 2); var S2 = Math.Pow(4 + var3, 2); var S3 = Math.Pow(var1, 2); var Calc1 = (S1 * (var2 / 3)); var Calc2 = (S1 * S3) / WP; var Calc3 = var3 + var1 * (S2 / WP); // WP从1开始,数组索引需减1 var currentColumn = columnTextBoxes[WP - 1]; currentColumn[0].Text = Calc1.ToString(CultureInfo.CreateSpecificCulture("en-GB")); currentColumn[1].Text = Calc2.ToString(CultureInfo.CreateSpecificCulture("en-GB")); currentColumn[2].Text = Calc3.ToString(CultureInfo.CreateSpecificCulture("en-GB")); }
方法2:动态查找控件(适配固定命名规则)
如果不想提前定义数组,可通过Controls.Find方法根据拼接的控件名称查找,注意第二个参数设为true,确保递归查找子容器(比如Panel、GroupBox)内的控件,避免之前找不到控件的问题:
double var1 = Convert.ToDouble(tb_value1.Text, CultureInfo.InvariantCulture); double var2 = Convert.ToDouble(tb_value2.Text, CultureInfo.InvariantCulture); double var3 = Convert.ToDouble(tb_value3.Text, CultureInfo.InvariantCulture); for (int WP = 1; WP <= 4; WP++) { var S1 = Math.Pow((var2 - var1) * WP, 2); var S2 = Math.Pow(4 + var3, 2); var S3 = Math.Pow(var1, 2); var Calc1 = (S1 * (var2 / 3)); var Calc2 = (S1 * S3) / WP; var Calc3 = var3 + var1 * (S2 / WP); // 拼接控件名称,WP对应列号,末尾数字对应行号 TextBox tb1 = Controls.Find($"textBox{WP}1", true).FirstOrDefault() as TextBox; TextBox tb2 = Controls.Find($"textBox{WP}2", true).FirstOrDefault() as TextBox; TextBox tb3 = Controls.Find($"textBox{WP}3", true).FirstOrDefault() as TextBox; // 判空避免空引用异常 if (tb1 != null) tb1.Text = Calc1.ToString(CultureInfo.CreateSpecificCulture("en-GB")); if (tb2 != null) tb2.Text = Calc2.ToString(CultureInfo.CreateSpecificCulture("en-GB")); if (tb3 != null) tb3.Text = Calc3.ToString(CultureInfo.CreateSpecificCulture("en-GB")); }
方法3:改用DataGridView(更优雅的表格方案)
如果界面尚未完全定型,建议直接使用DataGridView控件替代手动布局的文本框,处理表格数据更高效且易维护:
- 在设计器中拖入DataGridView控件,或通过代码初始化列行
- 实现代码:
// 初始化DataGridView(若未在设计器设置) dataGridView1.RowCount = 3; dataGridView1.ColumnCount = 4; // 设置列标题 for (int i = 0; i < dataGridView1.ColumnCount; i++) { dataGridView1.Columns[i].HeaderText = $"列{i + 1}"; } double var1 = Convert.ToDouble(tb_value1.Text, CultureInfo.InvariantCulture); double var2 = Convert.ToDouble(tb_value2.Text, CultureInfo.InvariantCulture); double var3 = Convert.ToDouble(tb_value3.Text, CultureInfo.InvariantCulture); for (int WP = 1; WP <= 4; WP++) { var S1 = Math.Pow((var2 - var1) * WP, 2); var S2 = Math.Pow(4 + var3, 2); var S3 = Math.Pow(var1, 2); var Calc1 = (S1 * (var2 / 3)); var Calc2 = (S1 * S3) / WP; var Calc3 = var3 + var1 * (S2 / WP); // WP对应列索引(WP-1),行0、1、2对应三个计算结果 dataGridView1.Rows[0].Cells[WP - 1].Value = Calc1.ToString(CultureInfo.CreateSpecificCulture("en-GB")); dataGridView1.Rows[1].Cells[WP - 1].Value = Calc2.ToString(CultureInfo.CreateSpecificCulture("en-GB")); dataGridView1.Rows[2].Cells[WP - 1].Value = Calc3.ToString(CultureInfo.CreateSpecificCulture("en-GB")); }
内容的提问来源于stack exchange,提问作者kurmi
相关产品推荐
相关产品推荐

