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

时间:2016-04-14 03:40:31

标签: c# winforms user-controls

我把“Tricky”放在标题中,因为我知道很难准确理解我想要的东西,但我会尽力清楚。

我有一个带有TextChange事件的textBox,它允许我创建用户想要的texbox数量(我们称之为 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);  
        }
    }
}

因此用户输入值,一切正常。如果他想更改 tChange 中的数字,也没问题!表单调整大小并创建TextBoxes。 然而如果他这样做(更改 tChange 的值),一切都会出错!像

这样的错误
  

指数超出范围

或者我无法从TextBoxes等获取值。

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

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

我还尝试在创建新内容之前删除旧代码,但我认为我的代码很古怪而且根本不起作用。

textBoxesQ[i].Dispose();

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

1 个答案:

答案 0 :(得分:0)

当号码改变时你需要做三件事:

  • 删除所有现有文本框
  • 使用新尺寸创建一个新数组,并将对该新数组的引用保存到您的字段中(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;
}