1

我的 Form1 中有 12 个按钮,每个按钮旁边都有一个文本框。按钮事件调用一个名为 dialogOpen 的方法,该方法处理从 form2 获取对象并将字符串值放入文本框中。

如何根据用户单击的按钮将返回的值放置在文本框中?因此,如果用户单击的是 button1,则返回的文本应放置在 textbox1 中,如果用户单击的是 button2,则返回的文本应放置在 textbox2 中。关键是避免使用字符串名称进行检查,因为按钮都可以称为“浏览”。

现在我下面的代码可以做到这一点,但它是相当重复的,这样做有更好的方法吗?

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

7 回答 7

2

编辑:我刚刚注意到您的事件处理程序。更多的重构随之而来:

就在这里。您需要以某种方式将文本框与按钮相关联。例如,像这样创建一个字典:

Dictionary<Button, TextBox> _dict;

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

对所有事件使用一个事件处理程序:

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

更改dialogueOpen为接受 Button 而不是字符串和

 _dict[btn].Text = form2Result.getValue();
于 2012-09-19T12:59:30.140 回答
1

1 你使用same delegateon allbutton

Nota (Thank's to Marty) :当您在表单设计器中时,选择所有按钮,然后为所有按钮设置“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")
     {
        ....
     }


}
于 2012-09-19T12:58:49.200 回答
1

将您的事件处理程序替换为

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);
}
于 2012-09-19T12:59:03.707 回答
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);
}

我在这里所做的是使用文本框名称的模式,例如,如果您的按钮的 id 如下:button_1、button_2、...、button_n,您可以推断出相应的文本框是什么。

如果你点击button_1,通过拆分它的id,你会知道它对应的文本框就是id为textbox1的文本框。

然后 dialogOpen 函数将如下所示:

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 是文本框所在容器的 id。

总而言之:

  • 我会为按钮和 texboxes id 使用模式。
  • 根据被点击的按钮,我推断出它对应的 texbox id。
  • 然后找到 texbox 并更新它的值。
于 2012-09-19T13:59:48.847 回答
0

您可以在所有按钮单击时使用字典和一种事件方法

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);
}
于 2012-09-19T13:01:07.783 回答
0

我认为您可以做的第一件事是通过消除对 switch 语句的需要来提高可读性:

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 映射到 TextBox,这反过来又允许您对所有按钮使用单个事件处理程序(由另外两个人建议)。

于 2012-09-19T13:23:56.183 回答
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;
            }
于 2012-09-19T13:27:55.130 回答