C# 如何制作任何标签';s颜色更改,而不为每个标签重复相同的颜色更改行?

C# 如何制作任何标签';s颜色更改,而不为每个标签重复相同的颜色更改行?,c#,winforms,C#,Winforms,我有一张画有3个标签的表格 我有这个密码 private void Form1_Load(object sender, EventArgs e) { //drawn 3 labels. List<Label> lstlabels = new List<Label>() { label1, label2, label3 }; int cnt = lstlabels.Count;

我有一张画有3个标签的表格

我有这个密码

  private void Form1_Load(object sender, EventArgs e)
        {
            //drawn 3 labels.

            List<Label> lstlabels = new List<Label>() { label1, label2, label3 };

            int cnt = lstlabels.Count;
            for (int i = 0; i < cnt; i++) lstlabels[i].Click += (object se, EventArgs ee) => { if (this.BackColor == SystemColors.Control) this.BackColor = Color.Yellow; };

        }

如果有25个标签,那么有25行这样的

但我想应该是一两行

标签可能不是label1、label2和label3,它们可能是lblBob、lblJohn、lblAndy


我想应该是一两行。。当更多的标签出现时,不会出现更多的行,但我不确定如何进行,因为我看不到如何在循环中进行

首先,为了方便起见,为事件创建一个单独的方法。 其次,当您使用关键字
this
时,您指的是表单,而不是发件人标签。在我们的新方法中,
sender
参数就是这个标签。 另外,如果所有的代码都应该这样做,那么就没有必要检查当前的背景色

private void Label_Clicked(object sender, EventArgs e)
{
     Label clickedLabel = (Label)sender;
     clickedLabel.BackColor = Color.Yellow;
}

首先,为了方便起见,为事件创建一个单独的方法。 其次,当您使用关键字
this
时,您指的是表单,而不是发件人标签。在我们的新方法中,
sender
参数就是这个标签。 另外,如果所有的代码都应该这样做,那么就没有必要检查当前的背景色

private void Label_Clicked(object sender, EventArgs e)
{
     Label clickedLabel = (Label)sender;
     clickedLabel.BackColor = Color.Yellow;
}

第一个参数(
se
)是发送方。使用
Label source=sa作为标签;source.BackColor=Color.Yellow@johnymapp它可以工作。太神了我在想,我必须使用反思,这将是一项研究。把你刚才给出的解决方案贴出来作为答案,我也会接受,因为MouseDown的反应比单击要快得多<代码>用于(int i=0;i{Label blah=se作为标签;if(blah.BackColor==SystemColors.Control)blah.BackColor=Color.Yellow;else blah.BackColor=SystemColors.Control;}如果标签列表仅用于连接click事件处理程序,那么我将使用在设计时连接的单个事件,如akali93 answer中所示。但很明显,在实际应用中,仅在第一次单击时更改颜色是非常奇怪的…@Phil1970没有人,包括我的问题中的我,以及任何人的评论,在设计时除了连接的单个事件之外,还提出了任何建议。它适用于我的应用程序,它有20个标签,能够点击它们,从而切换它们的背景颜色。所以,在mousedown中,如果它们是黄色,则将它们设置为灰色,如果它们是灰色,则将它们设置为黄色(此方法适用于此)。一个事件(MouseDown)。您想到了什么在“真正的应用程序”中不太适用?第一个参数(
se
)是发送方。使用
Label source=sa作为标签;source.BackColor=Color.Yellow@johnymapp它可以工作。太神了我在想,我必须使用反思,这将是一项研究。把你刚才给出的解决方案贴出来作为答案,我也会接受,因为MouseDown的反应比单击要快得多<代码>用于(int i=0;i{Label blah=se作为标签;if(blah.BackColor==SystemColors.Control)blah.BackColor=Color.Yellow;else blah.BackColor=SystemColors.Control;}如果标签列表仅用于连接click事件处理程序,那么我将使用在设计时连接的单个事件,如akali93 answer中所示。但很明显,在实际应用中,仅在第一次单击时更改颜色是非常奇怪的…@Phil1970没有人,包括我的问题中的我,以及任何人的评论,在设计时除了连接的单个事件之外,还提出了任何建议。它适用于我的应用程序,它有20个标签,能够点击它们,从而切换它们的背景颜色。所以,在mousedown中,如果它们是黄色,则将它们设置为灰色,如果它们是灰色,则将它们设置为黄色(此方法适用于此)。一个事件(MouseDown)。你有什么想法在“真正的应用”中不太适用?谢谢。。约翰尼·莫普(johnny mopp)在你面前的评论中击败了你,虽然我喜欢你使用(Label)而不是“as”,但它看起来更为熟悉,而且很好地了解了这两种方式。。我想他不会把他的评论作为回答,所以我会接受你的,如果他这样做了,我会把它转到他的。我还要注意,lambda表示法很好。。这一行对(inti=0;i{Label blah=se as Label;if(blah.BackColor==SystemColors.Control)blah.BackColor=Color.Yellow;else blah.BackColor=SystemColors.Control;}和yeah本可以为(inti=0;i键是铸造发送者,然后是提供BackColor属性的。无论是使用(标签)还是使用
作为
关键字铸造。谢谢。。约翰尼·莫普(johnny mopp)在你面前的评论中击败了你,虽然我喜欢你使用(Label)而不是“as”,但它看起来更为熟悉,而且很好地了解了这两种方式。。我想他不会把他的评论作为回答,所以我会接受你的,如果他这样做了,我会把它转到他的。我还要注意,lambda表示法很好。。这一行对(inti=0;i{Label blah=se as Label;if(blah.BackColor==SystemColors.Control)blah.BackColor=Color.Yellow;else blah.BackColor=SystemColors.Control;}和yeah本可以为(inti=0;i键是铸造发送者,然后是提供BackColor属性的。无论是使用(标签)还是使用
作为
关键字浇铸。
private void Label_Clicked(object sender, EventArgs e)
{
     Label clickedLabel = (Label)sender;
     clickedLabel.BackColor = Color.Yellow;
}