大家好我动态创建了一些按钮,当用户点击按钮时,我需要将所选按钮的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
}
}
答案 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)
可能的算法是:
示例代码:
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);
}
}