2016-09-06 136 views
1

我在做一個有多個按鈕和文本框的程序。我現在創建的程序甚至沒有完成50%,但代碼行超過5000使程序太大。有沒有一種方法來結合這些循環語句:組合for循環

單擊它時的第一個文本框。

var btn = new[] { btn1, btn2, btn3, btn4, btn5, btn6, btn7, btn8, btn9, btn10, btn11, btn12, btn13, btn14 }; 
for (int i = 0; i < 14; i++) 
{ 
    if (txt1.Text == btn[i].Text) 
    { 
     txt1.Text = ""; 
     btn[i].Visible = true; 
     break; 
    } 
} 

對於單擊時的第二個文本框。

var btn = new[] { btn1, btn2, btn3, btn4, btn5, btn6, btn7, btn8, btn9, btn10, btn11, btn12, btn13, btn14 }; 
for (int i = 0; i < 14; i++) 
{ 
    if (txt2.Text == btn[i].Text) 
    { 
     txt2.Text = ""; 
     btn[i].Visible = true; 
     break; 
    } 
} 

和更多的文本框。

+1

對所有按鈕使用相同的點擊事件。 – Sherlock

+4

爲什麼不把這段代碼放在一個需要改變的'TextBox'的函數中?您也可以只使用單個事件處理程序,然後使用「sender」參數來獲取對「TextBox」的引用。 –

+0

將它們全部連接到相同的事件並使用參數來獲取文本框 - 或者將它們全部放在它們自己的事件中並通過共享方法調用(通過文本框) – Greg

回答

4

仔細查看您正在使用的代碼,基於TextBox更改的東西是TextBox本身,以便您可以接受它作爲函數的參數,並將其餘語句包裝在函數中。然後它會檢查條件並更改按鈕的可見性。這可能看起來如下:

var arrayButtons = new Button[] { btn1, btn2, btn3, btn4, btn5, btn6, btn7, btn8, btn9, btn10, btn11, btn12, btn13, btn14 }; 
// Let the array be Global, so that we can avoid defining the same every call 
public void ChangeButtonVisibility(TextBox currentText) 
{ 
    for (int i = 0; i < arrayButtons.Length; i++) 
    { 
     if (currentText.Text == arrayButtons[i].Text) 
     { 
      currentText.Text = ""; 
      arrayButtons[i].Visible = true; 
      break; 
     } 
    } 
} 

所以,你可以這樣調用方法時TextBox1的點:

ChangeButtonVisibility(TextBox1); 

像這樣TextBox2中點擊了

ChangeButtonVisibility(TextBox2); 
+0

當你在它的時候,使Button數組成爲一個私有的靜態只讀字段,所以它不需要每次重建。 –

+0

@MrUniverse:謝謝你的建議,我已經編輯過了。 –

+0

謝謝@非幸運。直到看到這個,我纔想到了一種不同的方法。它幫助我縮短我的代碼。 – PlusUltra

0

也可以使帶有文本框的另一個陣列並在兩個陣列上循環:

var txts = new[] { txt1, txt2, txt3, txt4, txt5, txt6, txt7, txt8, txt9, txt10, txt11, txt12, txt13, txt14 }; 
var btns = new[] { btn1, btn2, btn3, btn4, btn5, btn6, btn7, btn8, btn9, btn10, btn11, btn12, btn13, btn14 }; 

foreach(var txt in txts) 
{ 
    foreach(var btn in btns) 
    { 
     if (txt.Text == btn.Text) 
     { 
      txt.Text = ""; 
      btn.Visible = true; 
      break; 
     } 
    } 
} 
0

我建議您避免編寫所有特定的點擊事件併爲所有文本框創建一個點擊事件。
爲了做到這一點,你必須添加一個指向文本框標籤的指針,它指向相應的按鈕。我會做的是,在形式的這樣的負載事件:

private void Form1_Load(object sender, EventArgs e) 
{ 
    textBox1.Tag = btn1; 
    textBox2.Tag = btn2; 
    textBox3.Tag = btn3; 
    textBox4.Tag = btn4; 
    textBox5.Tag = btn5; 
    textBox6.Tag = btn6; 
} 

現在,你有按鈕爲您的控件的標籤,你要做的是做一個點擊事件爲所有的文本框,投發件人,並檢查控件與它的標籤:

private void allTextboxes_Click(object sender, EventArgs e) 
{ 
    if ((sender as TextBox).Text == ((sender as TextBox).Tag as Button).Text) 
    { 
     (sender as TextBox).Text = ""; 
     ((sender as TextBox).Tag as Button).Visible = true; 
    } 
} 

我強烈希望這種類型的代碼在循環。

+0

我已將您的評論/答案納入考慮範圍,但作爲學生,我只能使用我的教授教授的代碼,這就是爲什麼我選擇了@非幸運的代碼。如果我的教授將這些教給我們,請不要擔心,我願意使用此代碼。感謝您的幫助。 – PlusUltra