如何在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的参数