【发布时间】:2020-07-23 17:27:36
【问题描述】:
我要做的是在按钮处于活动状态后更改按钮的背景颜色。到目前为止,我通过这种方式实现了它:
private void button3_Click(object sender, EventArgs e) // METEO BUTTON
{
DefaultButtons();
button3.BackColor = Color.LimeGreen;
// REST OF THE CODE HOES HERE
}
而 DefaultButtons 函数是这样的:
public void DefaultButtons()
{
List<Button> buttonsToDefualt = new List<Button>()
{
// MAIN MENU
button1,
button2,
[...]
buttonX
};
foreach (var item in buttonsToDefualt)
{
item.BackColor = Color.Green;
}
}
现在交换按钮的工作方式如下:将整个列表更改为默认颜色,然后激活按钮将颜色更改为 LimeGreen。没关系,但是: 1) 我必须启动 DefaultButtons();对于每个按钮单击 2)我必须手动将所有按钮添加到列表中,现在我有120多个按钮(是的,正在构建自定义界面......),并且继续手动添加很累。
我试过了:
void DefaultButtonsNew()
{
foreach (Button b in this.Controls)
{
if (b != null)
{
b.BackColor = Color.Green;
}
}
}
但是我有一个异常:System.InvalidCastException: 'Can't throw object 'System.Windows.Forms.SplitContainer' on type 'System.Windows.Forms.Button'。'
【问题讨论】:
-
foreach (Button b in this.Controls.OfType<Button>()) { b.BackColor = Color.Green; } -
或混合:
foreach (Control c in this.Controls) { if (c is Button b){ b.BackColor = Color.Green; } if (c is TextBox t) { t.BackColor = Color.Red; } } -
请注意,您没有指定这些控件是窗体的子控件还是代替另一个容器(Panel、TableLayoutPanel 等),或者两种情况都是可能的。如果是这种情况,当然
this.Controls不会找到它们。目前尚不清楚您为什么不使用List<Button>,也不清楚您是否在某个时候从该列表中删除了控件(因为场景发生了变化 - 有点,但足够了)。 -
您是要更改表单上的 所有 按钮,还是仅更改特定容器中的按钮?您如何确定需要更改背景颜色的按钮?
-
我猜你应该使用 Leave 或 LostFocus 事件。
标签: c#