2012-09-19 7 views
1

У меня есть 12 кнопок в моем Form1, и каждая кнопка имеет текстовое поле рядом с ним. Событие кнопки вызывает метод dialogOpen, который обрабатывает получение объекта из формы2 и помещает строковое значение в текстовое поле.Как я могу реорганизовать этот код C# ниже?

Как разместить значение в текстовом поле в зависимости от того, на какую кнопку нажал пользователь? Поэтому, если это кнопка1, на которую нажал пользователь, то текст должен быть помещен в текстовое поле1, и если это кнопка2, на которую щелкнул пользователь, то возвращаемый текст должен быть помещен в текстовое поле2. Дело в том, чтобы избежать использования имени строки для проверки, поскольку все кнопки можно назвать «просматривать».

Прямо сейчас мой код ниже делает это, но он довольно повторяющийся, есть ли лучше сделать это?

private void dailogueOpen(String btnName) 
    { 
     if (listBox1.SelectedItem == null) 
     { 
      MessageBox.Show("Please Select a form"); 
     } 
     else 
     { 
      var selectedItem = (FormItems)listBox1.SelectedItem; 
      var form2result = new Form2(myDataSet, selectedItem); 
      var resulOfForm2 = form2result.ShowDialog(); 

      if (resulOfForm2 == DialogResult.OK) 
      { 
       switch (btnName) 
       { 
        case "btn1": 
         textBox1.Text = form2result.getValue(); 
         break; 
        case "btn2": 
         textBox2.Text = form2result.getValue(); 
         break; 
        case "btn3": 
         textBox3.Text = form2result.getValue(); 
         break; 
        case "btn4": 
         textBox4.Text = form2result.getValue(); 
         break; 
        case "btn5": 
         textBox5.Text = form2result.getValue(); 
         break; 
       } 
      } 
     } 
    } 


    private void button1_Click(object sender, EventArgs e) 
    { 
     String name = "btn1"; 
     dailogueOpen(name); 
    } 

    private void button2_Click(object sender, EventArgs e) 
    { 
     String name = "btn2"; 
     dailogueOpen(name); 
    } 

    private void button3_Click(object sender, EventArgs e) 
    { 
     String name = "btn3"; 
     dailogueOpen(name); 
    } 

    private void button4_Click(object sender, EventArgs e) 
    { 
     String name = "btn4"; 
     dailogueOpen(name); 
    } 

    private void button5_Click(object sender, EventArgs e) 
    { 
     String name = "btn5"; 
     dailogueOpen(name); 
    } 

ответ

2

EDIT: Я просто заметил, обработчики событий. Далее следует рефакторинг:

Да, есть. Вам нужно каким-то образом связать текстовые поля с кнопками. Например, создать словарь так:

Dictionary<Button, TextBox> _dict; 

_dict[button1] = textBox1; 
_dict[button2] = textBox2; 
... 

Используйте один обработчик события для всех событий:

private void button_click(object sender, EventArgs e) 
{ 
    dialogeOpen((Button)sender); 
} 

Изменить dialogueOpen принять кнопку вместо строки и

_dict[btn].Text = form2Result.getValue(); 
+0

будет ли это работать, если все тексты кнопки говорят «просматривать», например. will dict [button1] все еще работает? –

+0

Да, заметьте, я имею в виду имя кнопки в C#, а не его текст. – zmbq

+0

+1 для того, чтобы быть самым частым ответом (с точки зрения кода) до сих пор, не делая ничего странного. –

1

1 Вы используете same delegate на всех button

Nota (Thank's to Marty) : Когда Вы находитесь в Form Designer, выберите все кнопки, а затем Ассинг затем «Generic_Click» для всех из них, или вы можете использовать код ниже.

this.btn1.Click += new System.EventHandler(Generic_Click); //the same delegate 
this.btn2.Click += new System.EventHandler(Generic_Click); 
this.btn3.Click += new System.EventHandler(Generic_Click); 
.... 


private void Generic_Click(object sender, EventArgs e) 
{ 
    var control = (Button)sender; 
    if( control.Name == "btn1") 
    { 
     .... 
    } 
    else if( control.Name == "btn2") 
    { 
     .... 
    } 
    else if( control.Name == "btn3") 
    { 
     .... 
    } 


} 
+0

Когда вы находитесь в Дизайнере форм, выберите все кнопки, а затем выберите «Generic_Click» для всех из них. – Marty

+0

Thank's Marty для вашего дополнения, вам приятно –

+0

Наверное, лучше сделать только один актер, а не кастинг в каждом выражении if. –

1

заменить eventhandlers на

private void ButtonClick(object sender, EventArgs e) 
{ 
    var button = sender as Button; 
    if (button == null) return; 
    String name = button.Text;// Tag, name etc 
    dailogueOpen(name); 
} 
+0

это означает, что еще нужно проверить, какое имя передано в dailogueOpen, что, если все кнопки называются «просматривать»? –

+0

Я не знаю конкретного вашего приложения, поэтому написал в комментарии альтернативные prorepties –

0

You может иметь словарь и один метод событий при всех нажатиях кнопок

Dictionary<Button, TextBox> dx = new Dictionary<Button, TextBox>; 

private void ButtonClick(object sender, EventArgs e) 
{ 
    var button = sender as Button; 
    if (button == null) return; 
    dx[button].Text = form2result.getValue(); 
} 

и конструктор, как это:

public ClassName() 
{ 
    dx.Add(button1, textBox1); 
    dx.Add(button2, textBox2); 
    dx.Add(button3, textBox3); 
} 
+0

будет работать, если все тексты кнопок, например, «просматривают». будет ли dx работать? –

+0

Да, потому что кнопки - разные объекты с разными хэш-кодами –

0

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

private void dailogueOpen(TextBox textBox) 
{ 
    if (listBox1.SelectedItem == null) 
    { 
     MessageBox.Show("Please Select a form"); 
    } 
    else 
    { 
     var selectedItem = (FormItems)listBox1.SelectedItem; 
     var form2result = new Form2(myDataSet, selectedItem); 
     var resulOfForm2 = form2result.ShowDialog(); 

     if (resulOfForm2 == DialogResult.OK) 
     { 
      textBox.Text = form2result.getValue(); 
     } 
    } 
} 


private void button1_Click(object sender, EventArgs e) 
{ 
    dailogueOpen(textBox1); 
} 

private void button2_Click(object sender, EventArgs e) 
{ 
    dailogueOpen(textBox2); 
} 

private void button3_Click(object sender, EventArgs e) 
{ 
    dailogueOpen(textBox3); 
} 

private void button4_Click(object sender, EventArgs e) 
{ 
    dailogueOpen(textBox4); 
} 

private void button5_Click(object sender, EventArgs e) 
{ 
    dailogueOpen(textBox5); 
} 

Это то дает вам разумный метод подписи ввести словарь (предложенный двумя другими людьми), чтобы сопоставить Button to TextBox, который, в свою очередь, позволит вам использовать один обработчик событий (предложенный двумя другими людьми) для всех кнопок.

0
private void button_Click(object sender, EventArgs e) 
     { 

      Button button = sender as Button; 
      if (button == null) return; 
      String name = button.Text;// Tag, name etc 


      dailogueOpen(name); 
     } 


    private void dailogueOpen(String btnName) 
     { 
      if (listBox1.SelectedItem == null) 
      { 
       MessageBox.Show("Please Select a form"); 
      } 
      else 
      { 
       var selectedItem = (FormItems)listBox1.SelectedItem; 
       var form2result = new Form2(myDataSet, selectedItem); 
       var resulOfForm2 = form2result.ShowDialog(); 

       if (resulOfForm2 == DialogResult.OK) 
       { 
        SetTxt(btnName,form2result.getValue()); 
       } 
      } 
    } 



     private void SetTxt(string btnName, string value) 
      { 
       int lenght = "Button".Length; 
       string index = btnName.Substring(lenght); //remove Button 
       TextBox t = (TextBox)this.Controls.Find("textBox" + index, true)[0]; 

       if (t != null) 
        t.Text = value; 
      } 
1

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

protected void ButtonClick(object sender, EventArgs e) 
{ 
    Button clickedButton = (Button) sender; 
    string selectedId = clickedButton.ID; 
    string[] idParameters = selectedId.Split('_'); 
    string textBoxId = "textbox" + idParameters[1]; 
    dailogueOpen(textBoxId); 
} 

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

Если вы нажмете кнопку_1, разделив его идентификатор, вы узнаете, что его соответствующим текстовым полем является тот, чей идентификатор является текстовым полем1.

Тогда функция dialogueOpen будет выглядеть следующим образом:

private void dailogueOpen(string textBoxId) 
{ 
    if (listBox1.SelectedItem == null) 
    { 
     MessageBox.Show("Please Select a form"); 
    } 
    else 
    { 
     var selectedItem = (FormItems)listBox1.SelectedItem; 
     var form2result = new Form2(myDataSet, selectedItem); 
     var resulOfForm2 = form2result.ShowDialog(); 
     if (resulOfForm2 == DialogResult.OK) 
     { 
      TextBox textBox = (TextBox)this.Form.FindControl("MainContent").FindControl(textBoxId); 
      textBox.Text = resulOfForm2.getValue(); 
    } 
} 

Где MainContent это идентификатор контейнера, где находятся текстовые поля.

Всего:

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