winforms 如何从数组中更改多个文本框?

apeeds0o  于 2023-02-24  发布在  其他
关注(0)|答案(1)|浏览(170)

我有一个包含不同练习名称的文本文件。我希望当我按下“恢复”按钮时,每个练习都会被放入一个文本框。我最初的文本文件是这样的:

string[] lines = System.IO.File.ReadAllLines("savedWorkout.txt");

            textBox1_1.Text = lines[0];
            textBox1_2.Text = lines[1];
            textBox1_3.Text = lines[2];
            textBox1_4.Text = lines[3];
            textBox1_5.Text = lines[4];
            textBox1_6.Text = lines[5];
            textBox1_7.Text = lines[6];

这样做可以更新文本框,但是我还有更多的文本框,所以我想在一个循环中填充每个文本框,使代码更紧凑,所以我尝试用数组:

string[] exercises = new string[] { textBox1_1.Text, textBox1_2.Text, textBox1_3.Text, textBox1_4.Text, textBox1_5.Text, textBox1_6.Text, textBox1_7.Text}

for (int i = 0; i < 7; i++)
            {
                exercises[i] = lines[i];
            }

这不起作用。虽然我运行代码时没有错误,但当我按下恢复按钮时,它不会更新文本框。我不确定原因。如果有任何关于如何修复此问题的建议,我们将不胜感激。

ss2ws0br

ss2ws0br1#

exercises字符串数组只存储字符串。它不存储或克隆对任何.Text属性的引用。因此,更改数组中的元素会更改数组,但不能更改TextBox。您应该这样做:

TextBox[] boxes = new TextBox[] { textBox1_1, textBox1_2, textBox1_3, textBox1_4, textBox1_5, textBox1_6, textBox1_7};

int i = 0;
var lines = File.ReadLines("savedWorkout.txt");
foreach(var line in lines.Take(boxes.Length)) 
{
    boxes[i++].Text = line;
}

如果文本框有一个公共的父控件,比如GroupBox或Panel,那就更好了。

TextBox[] boxes = ParentControl.Controls.OfType<TextBox>().ToArray();

在创建boxes数组时要小心!当Form类的字段首次初始化时,这些TextBox对象 * 还不存在 。这是稍后作为InitializeComponents()方法的一部分完成的。因此,请确保数组是使用它的方法的本地数组,或者在调用InitializeComponents() 之后 * 在构造中初始化。

相关问题