区分连​​接到同一事件处理程序的多个对象

时间:2013-08-15 02:23:08

标签: c# events button methods event-handling

我很难弄清楚如何搜索/说出我想要完成的事情。我正在寻找一种更安全/更智能的方法来实现以下示例。

假设我有3个名字按钮:

btnOne
btnTwo
btnThree

每个按钮的目的是在单击时将一个唯一的字符串写入某个文本框。由于所有三个按钮都执行非常类似的操作,因此为所有三个按钮创建一个事件处理程序似乎是合乎逻辑的,但是区分三个按钮以便正确的文本框可以获得正确的字符串的智能方法是什么?我不喜欢我现在的方式:

伪,伪代码:

private void Clicked(object sender, EventArgs e)
{
    string buttonName = (sender as Button).Name;
    switch(buttonName)
    {
         case "btnOne":
             tbOne.Text = "This text is from button one";
             break;
         case "btnTwo":
             tbTwo.Text = "This is some different text";
             break;
         case "btnThree":
             tbThree.Text = "Button three text";
             break;
    }
}

另一种方法是为每个按钮设置一个on click事件处理程序,然后有一个常见的方法,如:

private void AfterButtonClicked(Textbox tb, string text)
{
    tb.Text = text;
}

2 个答案:

答案 0 :(得分:1)

在您的情况下,重用的代码是将某些文本框的Text属性设置为某些字符串。就我个人而言,我没有看到以您演示所展示的的方式编写单个事件处理程序的好处。恕我直言,它使代码复杂化而不是简化它。

最好有三个独立的处理程序将三个单独的文本框属性设置为三个单独的字符串。然后你就不必再进行任何比较来找出发送事件的按钮了。

根据实际应用程序和处理程序内的代码,此观察结果可能有效,也可能无效。


但是,

Dictionary<Button, TextBox> buttonTextboxMap = new Dictionary<Button, TextBox> 
{
    {btnOne, tbOne}, 
    {btnTwo, tbTwo}, 
    {btnThree, tbThree}
};

Dictionary<Button, string> buttonStringMap = new Dictionary<Button, string> 
{
    {btnOne, "This text is from button one"},
    {btnTwo, "This is some different text"},
    {btnThree, "Button three text"}
};

void Clicked(object sender, EventArgs e)
{
    Button btn = (Button)sender;

    buttonTextboxMap[btn].Text = buttonStringMap[btn];
}

第二种方法是使用每个按钮的Tag属性。我喜欢这个,因为它将所有内容都封装在按钮本身中。然而,垮台是只有一个Tag属性,并且您无法保证它拥有适当的信息。 (您也可以继承Button来保存正确的信息,但我认为这取决于您使用多少次可用性以及您将使用此特定按钮的次数):

class TextBoxAndString
{
    public TextBox tb {get; set;}
    public String s {get; set;}
}

.ctor() //the form's constructor
{
    btnOne.Tag = new TextBoxAndString {tb = tbOne, s = "This text is from button one"};
    btnTwo.Tag = new TextBoxAndString {tb = tbTwo, s = "This is some different text"};
    btnThree.Tag = new TextBoxAndString {tb = tbThree, s = "Button three text"};   
} 

void Clicked(object sender, EventArgs e)
{
    Button btn = (Button)sender;
    TextBoxAndString tbs = (TextBoxAndString)btn.Tag;

    tbs.tb.Text = tbs.s;
}

答案 1 :(得分:0)

这是一个如此简单的案例,我想我只是为了简单起见,将它们全部留在自己的事件处理程序中。

如果您想要举办一个活动,可以使用以下方式测试sender

private void Clicked(object sender, EventArgs e)
{
    if (sender is btnOne)
        tbOne.Text = "This text is from button one";
    else if (sender is btnTwo)
        tbTwo.Text = "This is some different text";
    else if (sender is btnThree)
         tbThree.Text = "Button three text";
}

至少如果你重命名按钮,你的程序将无法编译,你会来这里解决它。

现在的方式,如果你将“btnOne”重命名为“btn1”,tbOne中的文字将无法更新,你可能不会注意到它。