Shaharyar
Shaharyar

Reputation: 12459

Dynamic method in c#

I have many labels on the form, and every label invokes same method with different argument(which belongs to label text/name). Here is the code:

    //"res" is an array
    private void label1_Click(object sender, EventArgs e)
    {                       
        checkresult(res[0]);
    }

    private void label2_Click(object sender, EventArgs e)
    {        
        checkresult(res[1]);
    }

    private void label3_Click(object sender, EventArgs e)
    {  
        checkresult(res[2]);
    }

    private void label4_Click(object sender, EventArgs e)
    { 
        checkresult(res[3]);
    }

    private void label5_Click(object sender, EventArgs e)
    {
        checkresult(res[4]);
    }

    private void label6_Click(object sender, EventArgs e)
    {
        checkresult(res[5]);
    }

    private void label7_Click(object sender, EventArgs e)
    {
        checkresult(res[6]);
    }

    private void label8_Click(object sender, EventArgs e)
    {
        checkresult(res[7]);
    }

    private void label9_Click(object sender, EventArgs e)
    {
        checkresult(res[8]);
    }

I just want to precise my code by defining only one method for all labels. How can i do it?

Upvotes: 1

Views: 563

Answers (4)

sa_ddam213
sa_ddam213

Reputation: 43636

You could set anonymous delegates in when you make the event handler

label1.Click += (s,e) => {checkresult(res[0]); };
label2.Click += (s,e) => {checkresult(res[1]); };
label3.Click += (s,e) => {checkresult(res[2]); };

Upvotes: 1

daryal
daryal

Reputation: 14929

First let all of your labels use the same Label_Click event.

private void Label_Click(object sender, EventArgs e)
{
    Label temp = sender as Label;
    if (temp != null)
    {
        string labelName = temp.Name;
        string labelId = labelName.Substring(5, labelName.Length);
        int id = int.Parse(labelId) - 1;
        checkresult(res[id]);
    }                
}

Upvotes: 3

Mehmet Ataş
Mehmet Ataş

Reputation: 11559

In WinForms, set your Index to Tag of Label and set each OnClick event to same EventHandler

 private void lbl_Click(object sender, EventArgs e)
 {
      checkresult(res[Convert.ToInt32((sender as Label).Tag)]);
 }

Upvotes: 0

Tigran
Tigran

Reputation: 62265

A pseudocode may look like this:

label1.Click += label_Click(object sender, EventArgs e); 
label2.Click += label_Click(object sender, EventArgs e);//SAME HANDLER
label3.Click += label_Click(object sender, EventArgs e);//SAME HANDLER
....

and after

private void label_Click(object sender, EventArgs e)
{
    if(sender == label1)
      checkresult(res[0]);
    else if(sender == label2)
      checkresult(res[1]);
   ... 
   ...
}

Upvotes: 4

Related Questions