C# - 在不指定标签名称的情况下为Label定义方法

时间:2014-05-08 07:35:31

标签: c# foreach label

我的表单有一组可以点击的标签 - 请参阅屏幕截图(播放机侧的标签93到标签21,计算机侧的标签10到22)。

enter image description here

我想要做的就是在单击控件时更改标签颜色。我已经想通了。

我的问题更多是关于清洁代码。而不是

private void Playerlabel_Click(object sender, EventArgs e)
      {

            lblPlayerCardInt.BackColor = Color.FromArgb(219, 255, 248);

      }

private void Playerlabel2_Click(object sender, EventArgs e)
      {

            lblPlayerCardStrength.BackColor = Color.FromArgb(219, 255, 248);

      }

//repeat 5 times and then another 5 times for the computer labels.

有没有办法定义一个方法,这样无论我点击标签还是计算机点击它,都会调用突出显示标签的方法。

我想的是

public void HighlightLabel()
{
    foreach (Control x in this.Controls)
      {
          if (x is Label)
              {
                  ((Label)x).BackColor = Color.FromArgb(219, 255, 248);
              }
      }
}

这是正确的做法吗?这似乎是一个显而易见的问题,但对C#/ OOP编程很新,所以要确保我以正确的方式进行编程。

5 个答案:

答案 0 :(得分:2)

是的,您只能为所有这些标签设置1 Click event-handler

第1步:

private void lbl_Click(object sender, EventArgs e)
{
    Label lbl = sender as Label;
    lbl.BackColor = Color.FromArgb(219, 255, 248);    
}

第2步:

如果您在设计时创建标签,请对每个标签执行以下操作:

  1. 在表单设计器上,选择标签,然后打开视图>属性> “事件”选项卡
  2. 从下拉列表
  3. 中选择lbl_Click事件处理程序

    OR

    如果您以编程方式创建标签,请改用:

    lblPlayerCardInt.Click += new EventHandler(lbl_Click);
    lblPlayerCardStrength.Click += new EventHandler(lbl_Click);
    ...
    

答案 1 :(得分:2)

看到你正在做的就是每次设置背景颜色为什么不只是有一个方法,并做类似的事情:

private void label_Click(object sender, EventArgs e)
{
    Label mylabel = (Label) sender;
    mylabel.backcolor = Color.FromArgb(219, 255, 248);
}

然后,您可以将Label_Click作为每个标签的click事件放入,而不是为每个标签执行单独的方法。

但是,如果您想根据标签执行更多操作,可以使用发件人确定单击的标签。像这样:

private void label_Click(object sender, EventArgs e)
{
    Label mylabel = (Label) sender;
    //Determine which label has been clicked by name or id for example
    switch(myLabel.Name)
    {
        case "lblPlayerCardint":
            //Do something
            break;
    }        
}

答案 2 :(得分:1)

您可以将事件发件人对象强制转换为标签

private void label_Click(object sender, EventArgs e)
 {
             Label lblClicked=sender as Label;
           lblClicked.BackColor = Color.FromArgb(219, 255, 248);

 }

答案 3 :(得分:0)

您可以使用OfType作为System.Linq命名空间的一部分:

foreach(Label lbl in this.Controls.OfType<Label>())
    lbl.BackColor  = Color.FromArgb(219, 255, 248);

答案 4 :(得分:0)

这应该为您提供帮助,并为表单上的所有标签注册相同的点击事件。

    this.Controls
        .OfType<Label>()
        .AsParallel()
        .ForAll(x => x.Click += (o,e) => x.BackColor= Color.FromArgb(219, 255, 248));