You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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控件替代手动布局的文本框,处理表格数据更高效且易维护:

  1. 在设计器中拖入DataGridView控件,或通过代码初始化列行
  2. 实现代码:
// 初始化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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 04:17:02