Как установить динамические параметры в методах c # - PullRequest
1 голос
/ 13 августа 2011

Я написал метод trial для кнопки btnTrial1:

public void trial(object sender, EventArgs e, Button btn, TextBox txt, Label lbl)
{

}

В моем приложении я генерирую больше кнопок, текстовых полей и ярлыков динамически с помощью кода и называю их последовательно как btnTrial2, txtTrial2, lblTrial2, затем btnTrial3, txtTrial3, lblTrial3 и т. Д. , Теперь я хочу установить trial в качестве EventHandler для btnTrial2, затем для btnTrial3 и т. Д.

Так что теперь, когда я вызываю метод trial из btnTrial1, мои параметры должны быть:

Public void (sender, e, btnTrail1, txtTrial1, lblTrial1)

Но когда я вызываю метод trial из btnTrial2, мои параметры должны быть:

Public void (sender, e, btnTrail2, txtTrial2, lblTrial2)

и так далее ...

Ответы [ 4 ]

3 голосов
/ 13 августа 2011
btnTrial1.YourEvent += (sender, args) => trial(sender, args,
        btnTrial1, txtTrial1, lblTrial1);
btnTrial2.YourEvent += (sender, args) => trial(sender, args,
        btnTrial2, txtTrial2, lblTrial2);

Вы упоминаете, что «генерируете их динамически» - это нормально, но если вы находитесь в цикле, вам также нужно остерегаться печально известной проблемы «захваченная переменная / цикл» - в частности, переменные «захвачены» должно быть внутри цикла; например:

for(int i = 1 ; i <= 10 ; i++) {
    var btnTrial = ...
    var txtTrial = ...
    var lblTrial = ...
    btnTrial.YourEvent += (sender, args) => trial(sender, args,
        btnTrial, txtTrial, lblTrial);
}

(если, например, btnTrial было объявлено за пределами цикла, случались бы плохие вещи)

0 голосов
/ 13 августа 2011

Два предложения:

  1. Refactor trial() для возврата EventHandler (или в идеале EventHandler<T>):

    public EventHandler GetTrialEventHandler(Button btn, TextBox txt, Label lbl)
    {
         return (sender, args) =>
         {
             // Do something with btn, txt, lbl
         };
    }
    
  2. Вместо того, чтобы называть элементы формы btnTrial1, btnTrial2 и т. Д., Почему бы просто не составить списки элементов (или список наборов Button + TextBox + Label)? Тогда вам просто нужно перечислить списки, чтобы настроить обработчики событий, а не жестко кодировать их для каждого.

0 голосов
/ 13 августа 2011

К каждой кнопке можно добавить:

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]);
}
0 голосов
/ 13 августа 2011

Почему бы не сделать пробную функцию

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