C# C-定义标签的方法而不指定标签名称

C# C-定义标签的方法而不指定标签名称,c#,foreach,label,C#,Foreach,Label,我有一个表单,它有一组可以点击的标签-参见屏幕截图标签93到标签21在播放器端和标签10到22在计算机端 我只想在单击控件时更改标签的背面颜色。这是我想出来的 我的问题更多的是关于干净的代码。而不是 private void Playerlabel_Click(object sender, EventArgs e) { lblPlayerCardInt.BackColor = Color.FromArgb(219, 255, 248); }

我有一个表单,它有一组可以点击的标签-参见屏幕截图标签93到标签21在播放器端和标签10到22在计算机端

我只想在单击控件时更改标签的背面颜色。这是我想出来的

我的问题更多的是关于干净的代码。而不是

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编程来说是一个新手,因此希望确保我的方法正确。

您可以使用系统的一部分。Linq命名空间:

foreach(Label lbl in this.Controls.OfType<Label>())
    lbl.BackColor  = Color.FromArgb(219, 255, 248);
您可以使用System.Linq命名空间的一部分:

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

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

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

 }

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

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

 }
是,您只能为所有这些标签设置一个单击事件处理程序:

步骤1:

步骤2:

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

在表单设计器上,选择标签,然后打开视图>属性>事件选项卡 从下拉列表中选择上面的lbl\u单击事件处理程序 或

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

lblPlayerCardInt.Click += new EventHandler(lbl_Click);
lblPlayerCardStrength.Click += new EventHandler(lbl_Click);
...
是,您只能为所有这些标签设置一个单击事件处理程序:

步骤1:

步骤2:

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

在表单设计器上,选择标签,然后打开视图>属性>事件选项卡 从下拉列表中选择上面的lbl\u单击事件处理程序 或

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

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

既然您每次都在设置背景色,为什么不使用一种方法并执行以下操作:

private void label_Click(object sender, EventArgs e)
{
    Label mylabel = (Label) sender;
    mylabel.backcolor = Color.FromArgb(219, 255, 248);
}
然后,您可以将Label_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;
    }        
}

既然您每次都在设置背景色,为什么不使用一种方法并执行以下操作:

private void label_Click(object sender, EventArgs e)
{
    Label mylabel = (Label) sender;
    mylabel.backcolor = Color.FromArgb(219, 255, 248);
}
然后,您可以将Label_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;
    }        
}

这应该可以为您实现这一点,并为表单上的所有标签注册相同的单击事件

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

这应该可以为您实现这一点,并为表单上的所有标签注册相同的单击事件

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

谢谢,非常感谢-我想这有助于搜索。-非常感谢,我想这对搜索很有帮助-