2016-09-06 139 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