c# - 区分附加到同一事件处理程序的多个对象

标签 c# events button methods event-handling

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

假设我有 3 个带有名称的按钮:

btnOne
btnTwo
btn三

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

伪,伪代码:

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

最佳答案

在您的情况下,重用的代码将some文本框的Text属性设置为some字符串。就我个人而言,我不认为以您为您演示的操作演示的方式编写单个事件处理程序有什么好处。恕我直言,它使代码变得复杂而不是简化。

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

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


但是,您可以重构它的一种方法是:

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

关于c# - 区分附加到同一事件处理程序的多个对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18245369/

相关文章:

java - Android 中 webview 上的 OnClick?

c# - 如何创建调度程序或将对象与调度程序关联到 BeginInvoke 调用

android - 单击后如何使按钮不可见?

c# - 更改框架 4.0 中数组的 Com Interop 表示?

javascript - 如何获取 Google 可视化表以对存在的格式化单元格值进行排序?

android - Xamarin.Forms:从 Iconize 创建一个圆形/圆形按钮

html - 外部 css 覆盖

c# - 无法从 asp.net 应用程序中关闭的 TextReader 表达式中读取内容

c# multithreading 方法名称预期

c# - MachineKey.Protect/Unprotect 的非 ASP.Net 等效项