棘手:动态创建的控件数组导致问题

Tricky : Array of controls dynamically created causing problems

我把 "Tricky" 放在标题中是因为我知道很难准确理解我想要什么,但我会尽量说清楚。

我有一个带有 TextChange 事件的文本框,它允许我创建用户想要的文本框数量(我们将其称为 tChange)。

这是此事件的部分代码:

int tester;
bool flag = false;
if (!Int32.TryParse(tChange.Text, out tester))
{
    flag = false;
    return;
}
else
{
    num = Convert.ToInt16(tChange.Text);
    flag = true;
}
if (flag == true)
{
    if (num >= 1)
    {
        for (int i = 0; i < num; i++)
        {
           this.Size = new Size(590, 225 + 105 * i);
           textBoxesQ[i] = new TextBox();
           this.Controls.Add(textBoxesQ[i]);
           textBoxesQ[i].Size = new Size(45, 20);
           textBoxesQ[i].Location = new Point(25, 100 + 100 * i - 1);  
        }
    }
}

这样用户输入值就OK了。如果他想在tChange里改号,也没问题!调整表单大小并创建文本框。 然而如果他这样做(改变tChange的值),一切都会出错!类似

的错误

Index out of range

或者我无法从文本框等中获取值。

我开始认为 TexBoxes 是在以前的 TexBoxes 之前创建的,错误来自于此,所以我尝试将新的放在前面,将旧的放在前面但是 none 工作..

textBoxesQ[i].BringToFront();
textBoxesQ[i].SendToBack();

我也试过在创建新的之前删除旧的,但我认为我的代码很古怪,根本不起作用。

textBoxesQ[i].Dispose();

编辑: 作为@Dr。 Stitch 说,这可能是因为每次更改 tChange 中的文本时都没有重新初始化 TextBox。现在我只需要弄清楚如何实现它。

数字变化时需要做三件事:

  • 删除所有现有的文本框
  • 创建一个具有新大小的新数组,并将对该新数组的引用保存到您的字段中 (textBoxesQ)
  • 初始化数组

所以像这样:

if (textBoxesQ != null)
{
    foreach (var textBox in textBoxesQ)
    {
        Controls.Remove(textBox);
    }
}
textBoxesQ = new TextBox[size];
for (int i = 0; i < size; i++)
{
    var textBox = new TextBox
    {
       Size = new Size(45, 20);
       Location = new Point(25, 100 + 100 * i - 1);  
    };
    Controls.Add(textBox);
    textBoxesQ[i] = textBox;
}