如何在c#方法中设置动态参数
我已经为按钮如何在c#方法中设置动态参数,c#,c#-4.0,parameters,event-handling,C#,C# 4.0,Parameters,Event Handling,我已经为按钮btnTrial1编写了一个方法trial: public void trial(object sender, EventArgs e, Button btn, TextBox txt, Label lbl) { } 在我的应用程序中,我通过代码动态生成更多的按钮、文本框和标签,并按顺序命名它们,如btnTrial2,txtTrial2,lblTrial2然后btnTrial3,txtTrial3,lblTrial3等等。现在我想将trial设置为btnTrial2的事件处理程序
btnTrial1
编写了一个方法trial
:
public void trial(object sender, EventArgs e, Button btn, TextBox txt, Label lbl)
{
}
在我的应用程序中,我通过代码动态生成更多的按钮、文本框和标签,并按顺序命名它们,如btnTrial2
,txtTrial2
,lblTrial2
然后btnTrial3
,txtTrial3
,lblTrial3
等等。现在我想将trial
设置为btnTrial2
的事件处理程序,然后设置为btnTrial3
等等
现在,当我从btnTrial1
调用方法trial
时,我的参数应该是:
Public void (sender, e, btnTrail1, txtTrial1, lblTrial1)
Public void (sender, e, btnTrail2, txtTrial2, lblTrial2)
但是当我从btnTrial2
调用方法trial
时,我的参数应该是:
Public void (sender, e, btnTrail1, txtTrial1, lblTrial1)
Public void (sender, e, btnTrail2, txtTrial2, lblTrial2)
等等……为什么不让您的试用版发挥作用
public void trial(object sender, EventArgs e)
{
}
然后根据发件人,使用不同的控件:
public void trial(object sender, EventArgs e)
{
Button btn;
TextBox txt;
Label lbl;
if (sender == btnTrial1){
btn = btnTrail1;
txt = txtTrial1;
lbl = lblTrial1;
}
if (sender == btnTrial2){
btn = btnTrail2;
txt = txtTrial2;
lbl = lblTrial2;
}
if (sender == btnTrial3){
btn = btnTrail3;
txt = txtTrial3;
lbl = lblTrial3;
}
//rest of the method
}
您提到“动态生成它们”-这很好,但如果您处于循环中,您还需要注意臭名昭著的“捕获变量/循环”问题-值得注意的是,“捕获的变量”必须位于循环内;例如:
for(int i = 1 ; i <= 10 ; i++) {
var btnTrial = ...
var txtTrial = ...
var lblTrial = ...
btnTrial.YourEvent += (sender, args) => trial(sender, args,
btnTrial, txtTrial, lblTrial);
}
for(int i=1;i试验(发送方、args、,
b中心、试验、试验);
}
(例如,如果在循环外声明了
btentral
,则会发生不好的事情)可以向每个按钮添加:
this.button.Click += new System.EventHandler(this.button_Click);
方法如下:
private void button_Click(object sender, EventArgs e)
{
String name = (sender as Control).Name;
int number = Int32.Parse(name.Substring(name.Length-1));
trial(sender, e, this.Controls["btnTrial"+number], this.Controls["txtTrial"+number], Controls["lblTrial"+number]);
}
两项建议:
trial()
以返回EventHandler
(或者理想情况下是EventHandler
):
btnTrial1
,btnTrial2
等,不如只列出元素列表(或者列出一组按钮
+文本框
+标签
),然后只需枚举列表即可设置事件处理程序,而不必为每一个设置硬代码你真的应该为你的事件使用
EventHandler
类型,而不是创建其他委托。你应该创建一个从包含你的参数的EventArgs
派生的类。你完全正确。我正在尝试将它用作EventHandler,并且将错误委托给实例方法不能有null“this”。并且很抱歉提供有关我的问题的完整信息,但我对编程领域还不熟悉,因此不知道应该输入哪些信息。很抱歉,再次进行测试,但存在一个问题。在我的应用程序中,用户可以进行任意数量的控件,因此建议继续比较值吗?+1是的,在这种情况下,解决方案应该简单且有效我尝试过这样做,但我可以将列表作为Eventhandler的参数