棘手:动态创建的控件数组导致问题
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;
}
我把 "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;
}