2013-01-09 20 views
1

我在窗体上有很多标签,每个标签都用不同的参数(属于标签文本/名称)调用同一个方法。这里是代码: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]); 
    } 

我只想通过为所有标签定义一个方法来精确我的代码。我该怎么做?

回答

4

伪代码可能看起来像这样:

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

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

是否'Label'允许命令参数您可以设置在匿名委托? –

+0

@FilipEkberg:“命令参数”?你什么意思 ? – Tigran

+0

至少在'CommandEventArgs'上有'CommandArgument',这会导致更干净的代码。虽然这可能不适用于'标签'。 –

0

在的WinForms,你的指数设置为标签的标签和每个OnClick事件设置为相同的事件处理程序

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

首先让您的所有标签使用相同的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

这也是一个不错的解决方案,但对于这个问题,这是完美的。感谢回答:) – Shaharyar

+0

我会说这是一个很好的解决方案:)意味着如果添加更多标签,则不必编辑处理程序。 –

1

时,你的事件处理程序

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