2

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

假设我有 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;
    }
}

另一种方法是为每个按钮设置一个单击事件处理程序,然后该处理程序具有一个通用方法,例如:

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

2 回答 2

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;
}
于 2013-08-15T02:34:16.110 回答
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将无法更新,您可能不会注意到它。

于 2013-08-15T02:29:21.730 回答