2016-04-14 71 views
0

我在標題中加入了「Tricky」,因爲我知道它很難準確理解我想要的內容,但我會盡量清楚。Tricky:動態創建的控件數組導致問題

我有一個TextBox TextChange事件的文本框,它允許我創建用戶想要的texboxes的數量(我們將其稱爲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),一切都出錯!像

錯誤

指數超出範圍

或者我不能從文本框等獲取值..

我開始以爲是TexBoxes在以前的前創建從這個傳來了錯誤,所以我試圖把新的向前,把舊的到前面,但沒有工作..

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

我也試圖DELET e創建新的舊版本之前,但我認爲我的代碼很古怪,根本不起作用。

textBoxesQ[i].Dispose(); 

編輯:作爲@Dr。 Stitch說,它可能來自於每當tChange中的文本被改變時不重新初始化文本框。現在我只需要弄清楚如何實現它。

+0

更改爲(int i = 0;我 Claudius

+0

我不認爲這是問題所在。我遇到了這個問題,例如,我將_tChange_中的值設置爲2,然後是3,前兩個TextBox將不起作用。 – UnderPaidIntern

+1

問題在於textBoxesQ數組,您應該每次改變num值時重新初始化數組:TextBoxes [] textBoxesQ = new TextBoxes [num]。 :) –

回答

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; 
} 
+0

它的工作!非常好,我應該嘗試學習如何有一天正確的代碼!無論如何謝謝@Jon – UnderPaidIntern