将backcolor设置为用户单击的按钮

时间:2013-07-10 15:08:54

标签: c# winforms

大家好我动态创建了一些按钮,当用户点击按钮时,我需要将所选按钮的BackColor设置为某些突出显示的颜色,根据我编写的代码,它为每个按钮应用颜色,而不是我需要为用户点击按钮应用颜色

我创建按钮的代码如下

for(int i=0;i<5;i++)
{
    Button btyDynamic = new Button();
    btyDynamic .Click += new EventHandler(btyDynamic _Click);
    btyDynamic .AutoSizeMode = AutoSizeMode.GrowAndShrink;
    btyDynamic .AutoSize = true;
    btyDynamic .Text = i.ToString();
    btyDynamic .Tag = i.ToString();;
}

protected void btyDynamic(object sender, EventArgs e)
{
   Button btn= sender as Button;
   string strTag= btn.Tag.ToString();
   switch(strTag)
   {
      case "0":
         btn.BackColor=Color.LightSteelBlue;
       break;
     // Like this I am writing, now when in Case2 I need to remove the color of the first button and to show the backcolor of second button
   }
}

6 个答案:

答案 0 :(得分:2)

您可以存储所选的最后一个按钮,然后重置BackColor

private Button _lastButtonSelected = null;
protected void btyDynamic(object sender, EventArgs e)
{
   // Set new button back color
   Button btn = sender as Button;
   if(btn != null)
   {
      btn.BackColor = Color.LightSteelBlue;
   }
   // Reset last button color
   if(_lastButtonSelected != null)
   {
      _lastButtonSelected.BackColor = ...; // Put default back color here
   }
   _lastButtonSelected = btn;
}

如果您希望BackColor保持LightSteelBlue,如果您点击两次相同的按钮,则只需要检查_lastButtonSelected != btn

答案 1 :(得分:1)

你可以为所有按钮制作一个foreach,并删除不等于发送者的所有按钮的背景。假设将所有按钮保存到数组中(_AllButtons)。你可以写一些像这样的代码:

Button btn= sender as Button;
foreach(var currentButton in _AllButtons) {
   if(currentButton !=btn) {
        currentButton.BackColor=Color.Transparent;
   }
}

答案 2 :(得分:0)

可能的算法是:

  • 按照您的方式创建按钮一次,并将click事件绑定到一个处理程序
  • 点击处理程序中的
  • 首先将所有按钮重置为标准背景颜色
  • 点击处理程序中的
  • 使用开关查找当前单击的按钮,并设置此按钮的颜色

示例代码:

Action resetButtonColor = () => 
{
    button1.BackColor = Colors.Red;
    button2.BackColor = Colors.Red
    button3.BackColor = Colors.Red;
};

resetButtonColor();

var selected = Colors.Green;
switch(strTag)
{
    case "1": button1.BackColor = selected;
    case "2": button2.BackColor = selected;
    case "3": button3.BackColor = selected;
}

答案 3 :(得分:0)

然后你必须明确地分配这个按钮的点击事件。 所有其他人都可以有这个处理程序,但是一个按钮不应该,因为它太通用了这样处理。

答案 4 :(得分:0)

你可以试试这个:

    Color highLite = Color.Black;

    public Form1()
    {
        InitializeComponent();
        for (int i = 0; i < 20; i++)
        {
            Button b = new Button();
            b.Text = i.ToString();
            b.Tag = null;
            b.Click += b_Click;
            flowLayoutPanel1.Controls.Add(b);
        }
    }

    void b_Click(object sender, EventArgs e)
    {
        Button b = sender as Button;
        if (b == null)
            return;

        b.BackColor = highLite;

        // clear backcolors
        foreach (Control c in flowLayoutPanel1.Controls)
            if (c != b)
                c.BackColor = SystemColors.Control;
    }

答案 5 :(得分:0)

确保您只设置要设置的控件的后置颜色。使标签具有独特的功能,告诉您要更改它。

private Color offColor = Color.Red;
private Color onColor = Color.Blue;
private String btyPrefix = "bty";

private void btyDynamic_click(object sender, EventArgs e)
{
    Control control = (Control)sender;
    // enumerate this.Controls, but if they go into a different container, enumerate over that
    this.Controls.OfType<Control>()
        .Where(c => ((String)c.Tag).Contains(btyPrefix))
        .ToList<Control>()
        .ForEach(c =>
            {
                if (control == c)
                    c.BackColor = onColor;
                else
                    c.BackColor = offColor;
            }
    );
}

private void Form1_Load(object sender, EventArgs e)
{
    Button btyDontChange = new Button();
    btyDontChange.AutoSize = true;
    btyDontChange.AutoSizeMode = AutoSizeMode.GrowAndShrink;
    btyDontChange.Text = "x";
    btyDontChange.Tag = "something";
    btyDontChange.Location = new Point(0, 0);
    this.Controls.Add(btyDontChange);
    for (int i = 0; i < 5; i++)
    {
        Button btyDynamic = new Button();
        btyDynamic.Click += new EventHandler(btyDynamic_click);
        btyDynamic.AutoSizeMode = AutoSizeMode.GrowAndShrink;
        btyDynamic.AutoSize = true;
        btyDynamic.Text = i.ToString();
        btyDynamic.Tag = btyPrefix + i.ToString();
        btyDynamic.Location = new Point((i+1) * 50, 0);
        btyDynamic.BackColor = offColor;
        this.Controls.Add(btyDynamic);
    }
}