Я делаю программу с несколькими кнопками и текстовыми полями. Программа, которую я сейчас создаю, не завершена даже на 50%, но строк кода более 5000, что делает программу слишком большой. Есть ли способ объединить их для операторов цикла:

Для первого текстового поля при нажатии.

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

И многое другое текстовое поле.

c#
1
PlusUltra 6 Сен 2016 в 08:23

3 ответа

Лучший ответ

Внимательно изучите код, который вы используете. То, что изменяется на основе 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 Clicked

ChangeButtonVisibility(TextBox2);
4
sujith karivelil 17 Июл 2019 в 13:51

Я бы посоветовал вам не писать все конкретные события щелчка и сделать одно событие щелчка для всех ваших текстовых полей.
для этого вам нужно добавить указатель на тег текстового поля, который указывает на соответствующую кнопку. я бы сделал это в событии загрузки такой формы:

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
Niklas 6 Сен 2016 в 08:15

Или вы можете создать другой массив с текстовыми полями и перебрать оба массива:

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
Slai 6 Сен 2016 в 05:55