winforms 制作一个C# WinForm项目,如何添加一个额外的循环来填充TextBoxGroup中的额外文本框?

6jygbczu  于 11个月前  发布在  C#
关注(0)|答案(2)|浏览(139)

我最近做了一个C# WinForm计算器项目,它填充了一个3x4的文本框块。像这样:
3x4 block of text boxes in the form pluss the input TextBoxes
这是代码:

private void calculate_Click(object sender, EventArgs e)
{
    TextBox[][] textBoxOutputGroups = new[]
    {
        new [] { tb_Stress111, tb_Stress112, tb_Stress113, },
        new [] { tb_Stress121, tb_Stress122, tb_Stress123, },
        new [] { tb_Stress131, tb_Stress132, tb_Stress133, },
        new [] { tb_Stress141, tb_Stress142, tb_Stress143, },
    };

    if (TextBox1.Text == "" || TextBox2.Text == "")
    {
        MessageBox.Show("Some textboxes are empty!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
    }
    else
    {
        double var1;
        double var2;
        double var3;

        var1 = Convert.ToDouble(TextBox1.Text, CultureInfo.InvariantCulture);
        var2 = Convert.ToDouble(TextBox2.Text, CultureInfo.InvariantCulture);

        if (TextBox3.Text == "")
        {
            var3 = (-0.007 * var1 * 2) + 1.8;
        }

        else
        {
            var3 = Convert.ToDouble(TextBox3.Text, CultureInfo.InvariantCulture);
        }

        for (int WP = 0; WP <= 3; WP++)
        {
            var S1 = Math.Pow((var2 - var1) * WP, 2);
            var S2 = Math.Pow(4 + var3, 2);
            var S3 = Math.Pow(var1, 2);

            double[] outputValues = new[]
            {
                S1 * var2 / 3,
                S1 * S3 / WP,
                var3 + var1 * S2 / WP,
            };

            for (int i = 0; i < outputValues.Length; i++)
            {
                 textBoxOutputGroups[WP][i].Text =
                     outputValues[i].ToString(CultureInfo.CreateSpecificCulture("en-GB"));
            }

         }

    }
}

字符串
这一个应该填补了一组12个文本框。
我现在要做的是添加额外的5组3x4文本框组,其输出将根据包含'j'变量的新循环的条件进行填充和修改,还将添加新的tadd变量。
大概是这样的:

TextBox[][] textBoxOutputGroups = new[]
{
    new [] { tb_Stress111, tb_Stress112, tb_Stress113, },
    new [] { tb_Stress121, tb_Stress122, tb_Stress123, },
    new [] { tb_Stress131, tb_Stress132, tb_Stress133, },
    new [] { tb_Stress141, tb_Stress142, tb_Stress143, },
    new [] { tb_Stress211, tb_Stress212, tb_Stress213, },
    new [] { tb_Stress221, tb_Stress222, tb_Stress223, },
    new [] { tb_Stress231, tb_Stress232, tb_Stress233, },
    new [] { tb_Stress241, tb_Stress242, tb_Stress243, },
    new [] { tb_Stress311, tb_Stress312, tb_Stress313, },
    new [] { tb_Stress321, tb_Stress322, tb_Stress323, },
    new [] { tb_Stress331, tb_Stress332, tb_Stress333, },
    new [] { tb_Stress341, tb_Stress342, tb_Stress343, },
    new [] { tb_Stress411, tb_Stress412, tb_Stress413, },
    new [] { tb_Stress421, tb_Stress422, tb_Stress423, },
    new [] { tb_Stress431, tb_Stress432, tb_Stress433, },
    new [] { tb_Stress441, tb_Stress442, tb_Stress443, },
    new [] { tb_Stress511, tb_Stress512, tb_Stress513, },
    new [] { tb_Stress521, tb_Stress522, tb_Stress523, },
    new [] { tb_Stress531, tb_Stress532, tb_Stress533, },
    new [] { tb_Stress541, tb_Stress542, tb_Stress543, },
    new [] { tb_Stress611, tb_Stress612, tb_Stress613, },
    new [] { tb_Stress621, tb_Stress622, tb_Stress623, },
    new [] { tb_Stress631, tb_Stress632, tb_Stress633, },
    new [] { tb_Stress641, tb_Stress642, tb_Stress643, },
    new [] { tb_Stress711, tb_Stress712, tb_Stress713, },
    new [] { tb_Stress721, tb_Stress722, tb_Stress723, },
    new [] { tb_Stress731, tb_Stress732, tb_Stress733, },
    new [] { tb_Stress741, tb_Stress742, tb_Stress743, },
    new [] { tb_Stress811, tb_Stress812, tb_Stress813, },
    new [] { tb_Stress821, tb_Stress822, tb_Stress823, },
    new [] { tb_Stress831, tb_Stress832, tb_Stress833, },
    new [] { tb_Stress841, tb_Stress842, tb_Stress843, },
    new [] { tb_Stress911, tb_Stress912, tb_Stress913, },
    new [] { tb_Stress921, tb_Stress922, tb_Stress923, },
    new [] { tb_Stress931, tb_Stress932, tb_Stress933, },
    new [] { tb_Stress941, tb_Stress942, tb_Stress943, },
    new [] { tb_Stress1011, tb_Stress1012, tb_Stress1013, },
    new [] { tb_Stress1021, tb_Stress1022, tb_Stress1023, },
    new [] { tb_Stress1031, tb_Stress1032, tb_Stress1033, },
    new [] { tb_Stress1041, tb_Stress1042, tb_Stress1043, },
    new [] { tb_Stress1111, tb_Stress1112, tb_Stress1113, },
    new [] { tb_Stress1121, tb_Stress1122, tb_Stress1123, },
    new [] { tb_Stress1131, tb_Stress1132, tb_Stress1133, },
    new [] { tb_Stress1141, tb_Stress1142, tb_Stress1143, },
    new [] { tb_Stress1211, tb_Stress1212, tb_Stress1213, },
    new [] { tb_Stress1221, tb_Stress1222, tb_Stress1223, },
    new [] { tb_Stress1231, tb_Stress1232, tb_Stress1233, },
    new [] { tb_Stress1241, tb_Stress1242, tb_Stress1243, },
};

if (tb_AorticInnerRadious.Text == "" || tb_BloodPressureSystolic.Text == "")
{
    MessageBox.Show("Some textboxes are empty!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
else
{
    double var1;
    double var2;
    double var3;

    var1 = Convert.ToDouble(tb_AorticInnerRadious.Text, CultureInfo.InvariantCulture);
    var2 = Convert.ToDouble(tb_BloodPressureSystolic.Text, CultureInfo.InvariantCulture);

    if (tb_AorticWallThickness.Text == "")
    {
        var3 = (-0.007 * var1 * 2) + 1.8;
    }

    else
    {
        var3 = Convert.ToDouble(tb_AorticWallThickness.Text, CultureInfo.InvariantCulture);
    }
        var tadd = ((1.25 * var3) - var3) / 6;
        
        for(int j = 1; j < 6; j++) 
        { 
            if(j > 1)
            {
                var3 = var3 + (((Math.Abs(7 - j) * (-1)) + 6) * tadd);
            }

            for (int WP = 0; WP <= 3; WP++)
            {
                var S1 = Math.Pow((var2 - var1) * WP, 2);
                var S2 = Math.Pow(4 + var3, 2);
                var S3 = Math.Pow(var1, 2);

                double[] outputValues = new[]
                {
                    S1 * var2 / 3,
                    S1 * S3 / WP,
                    var3 + var1 * S2 / WP,
                };

                for (int i = 0; i < outputValues.Length; i++)
                {
                    textBoxOutputGroups[WP][i].Text =
                        outputValues[i].ToString(CultureInfo.CreateSpecificCulture("en-GB"));
                }

            }
        }


上面的这个只填充了原始textBoxOutputGroups中的文本框,其余的为空。
除非有更好的选择,否则除了添加额外的textBoxOutputGroups或将所有新的文本框添加到现有的组中之外,我看不到其他方法。
我该怎么做?

xnifntxz

xnifntxz1#

试试这个方法。
创建一个自定义的UserControl(我将其命名为TextBoxesBlock)。该UserControl应该代表一组3x4的TextBox:


的数据
对于每个TextBox,设置一个Tag属性,其中包含TextBox的编号(从1到12),例如:



标记将用于正确地计算和排序控件,以在代码隐藏中构建TextBox的二维3x4数组。该支持数组将用于计算(确切地说,通过“行”(Stress)和“列”(Wall Place)的索引轻松访问具体的TextBox)。
此外,在UserControl的代码隐藏中提供了计算方法。从您的示例中假设,计算一半取决于某些用户输入值,一半取决于以前的TextBoxesBlock,所以我决定使用该参数作为方法参数:

TextBoxesBlock.cs:

public partial class TextBoxesBlock : UserControl
{
    private readonly TextBox[,] _textBoxGroup = new TextBox[3, 4];
    private readonly CultureInfo _enGBCulture = CultureInfo.CreateSpecificCulture("en-GB");

    public TextBoxesBlock()
    {
        InitializeComponent();

        // Get a list of TextBoxes, ordered by Tag property (Tag should contain TextBox "number")
        var textBoxes = this.Controls.OfType<TextBox>().OrderBy(tb => int.Parse(tb.Tag?.ToString())).ToList();
        var textBoxIndex = 0;
        // Fill backing array of TextBoxes with rerefences to TextBoxes on Form
        for (var wallPlace = 0; wallPlace < 4; wallPlace++)
            for (var stress = 0; stress < 3; stress++)
            {
                _textBoxGroup[stress, wallPlace] = textBoxes[textBoxIndex];
                textBoxIndex++;
            }
    }

    public void Calculate(int j, double var1, double var2, double var3)
    {
        if (j > 1)
        {
            var tadd = ((1.25 * var3) - var3) / 6;
            var3 += ((Math.Abs(7 - j) * -1) + 6) * tadd;
        }

        for (int wallPlace = 0; wallPlace < 4; wallPlace++)
        {
            var stressX1 = Math.Pow((var2 - var1) * wallPlace, 2);
            var stressX2 = Math.Pow(4 + var3, 2);
            var stressX3 = Math.Pow(var1, 2);

            var stressValues = new[]
            {
                stressX1 * var2 / 3,
                stressX1 * stressX3 / wallPlace,
                var3 + var1 * stressX2 / wallPlace
            };

            for (int stress = 0; stress < stressValues.Length; stress++)
                _textBoxGroup[stress, wallPlace].Text = stressValues[stress].ToString(_enGBCulture);
        }
    }
}

字符串
在另一个表单中,我添加了FlowLayoutPanel(下面的flp1),它将包含TextBoxesBlock s,并添加了其中的6个:

public MainForm
{
    InitializeComponent();
    // ...
    for (var i = 0; i < 6; i++)
        flp1.Controls.Add(new TextBoxesBlock());

    // ...
}


最后,在按钮处理程序中,您只需从FlowLayoutPanel接收TextBoxesBlock的列表,并在每个列表上迭代调用Calculate方法并提供必要的参数(arguments)。由于您没有为var1var2var3提供初始值,因此我只为所有TextBoxesBlock添加1

private void calculate_Click(object sender, EventArgs e)
{
    //if (TextBox1.Text == "" || TextBox2.Text == "")
    //{
    //    MessageBox.Show("Some textboxes are empty!", ...);
    //    return;
    //}

    double var1;
    double var2;
    double var3;

    //var1 = Convert.ToDouble(TextBox1.Text, CultureInfo.InvariantCulture);
    //var2 = Convert.ToDouble(TextBox2.Text, CultureInfo.InvariantCulture);
    //if (TextBox3.Text == "")
    //    var3 = (-0.007 * var1 * 2) + 1.8;
    //else
    //    var3 = Convert.ToDouble(TextBox3.Text, CultureInfo.InvariantCulture);

    var blocks = flp1.Controls.OfType<TextBoxesBlock>().ToList();

    for (var j = 0; j < blocks.Count; j++)
    {
        var textBoxesBlock = blocks[j];
        textBoxesBlock.Calculate(j + 1, 1, 1, 1);
    }
}


结果我得到:



也许不是一个“现成的复制”解决方案,但我希望你会得到的想法。

btxsgosb

btxsgosb2#

我同意让一个UserControl来表示每个3x4块更有意义,但是你已经表明你想保持当前的设置。
考虑到这一点,您可以通过使用Controls.Find()和递归搜索选项“按名称”搜索每个TextBox。
它可以归结为:

String group = "4";
String wall = "3";
String stress = "1";
String ctlName = "tb_Stress" + group + wall + stress;
Control[] ctls = this.Controls.Find(ctlName, true);
if (ctls.Length > 0 && ctls[0] is TextBox)
{
    TextBox tb = (TextBox)ctls[0];
    // .. do something with "tb" ...
    tb.Text = "hello!";
}

字符串
请注意,如果您为组输入两位数,则当前命名约定可能会导致错误的TextBox。
要解决这个问题,你可以在数字中使用前导零,或者用另一个字符(如._)分隔它们:

tb_Stress040301

tb_Stress.4.3.1

tb_Stress_4_3_1

相关问题