gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 13:37:21 24 4
gpt4 key购买 nike

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

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

btnOne
btn二
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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com