2013-01-09 3 views
1

J'ai plusieurs étiquettes sur le formulaire, et chaque étiquette invoque la même méthode avec un argument différent (qui appartient à l'étiquette texte/nom). Voici le code:Méthode dynamique dans C#

//"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]); 
    } 

Je veux juste préciser mon code en définissant une seule méthode pour toutes les étiquettes. Comment puis-je le faire?

Répondre

4

Un pseudo-code peut ressembler à ceci:

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

et après

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

Est-ce que 'permet LABEL' à l'argument de commande? –

+0

@FilipEkberg: "argument de commande"? Que voulez-vous dire ? – Tigran

+0

Au moins sur 'CommandEventArgs' vous avez' CommandArgument' qui conduirait à beaucoup plus de code propre. Peut-être que cela ne fonctionne pas sur 'Label'. –

0

En WinForms, réglez votre index Tag d'étiquette et définir chaque événement OnClick même EventHandler

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

D'abord, laissez toutes vos étiquettes utiliser le même événement Label_Click.

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]); 
    }     
} 
+0

C'est aussi une bonne solution, mais pour cette question, c'était parfait. Merci d'avoir répondu :) – Shaharyar

+0

Je dirais que c'était une excellente solution:) Signifie que vous n'avez pas besoin de modifier le gestionnaire si vous ajoutez plus d'étiquettes. –

1

Vous pouvez définir des délégués anonymes lorsque vous faites le gestionnaire d'événements

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