請考慮,我是一個新來的c#。掃描約700個帖子後,我決定發佈一個更多的問題:自動更改活動控件的屬性
在我的Windows窗體(c#)我有一些控件,包括文本框,複選框等。 我想在控件變爲活動狀態時更改背景顏色。 我知道我可以提高每個控件的「輸入」和「離開」事件來改變相應的屬性,但應該有另一種方式。
請考慮,我是一個新來的c#。掃描約700個帖子後,我決定發佈一個更多的問題:自動更改活動控件的屬性
在我的Windows窗體(c#)我有一些控件,包括文本框,複選框等。 我想在控件變爲活動狀態時更改背景顏色。 我知道我可以提高每個控件的「輸入」和「離開」事件來改變相應的屬性,但應該有另一種方式。
只要輸入和離開事件 - 切換每個顏色。保存保存在OnEnter
使用最後一種顏色在OnLeave
public Form1()
{
InitializeComponent();
var lastColorSaved = Color.Empty;
foreach(Control child in this.Controls)
{
child.Enter += (s, e) =>
{
var control = (Control)s;
lastColorSaved = control.BackColor;
control.BackColor = Color.Red;
};
child.Leave += (s, e) =>
{
((Control)s).BackColor = lastColorSaved;
};
}
}
創建一個類別(例如ControlColorizer。),並在它的構造通:
1)對於「主動控制」,並保存到內部顏色變量
2)的可變長度的控制陣列
在構造器添加對的OnEnter和OnLeave相同的事件處理程序上的每個控制
在的OnEnter事件中設置背景色
在OnLeave事件中設置的標準背景顏色
的優點是所有在使用類:
1)在你的表單類
2)初始化在InitializeComponent後的形式構造器聲明全局實例。
3)忘記一切。沒有其他代碼需要
因此,讓我的代碼說明一切:
這將進入一個名爲ControlColorizer.cs
public class ControlColorizer
{
private Color _setBColor = SystemColors.Window;
public ControlColor(Color bkg, params Control[] ctls)
{
_setBColor = bkg;
foreach (Control o in ctls)
{
o.Enter += new EventHandler(o_Enter);
o.Leave += new EventHandler(o_Leave);
}
}
private void o_Enter(object sender, EventArgs e)
{
if (sender is Control)
{
Control c = (Control)sender;
c.BackColor = _setBColor;
}
}
private void o_Leave(object sender, EventArgs e)
{
Control c = sender as Control;
c.BackColor = SystemColors.Window;
}
現在,在你需要你具備的功能每一種形式構造器這
ControlColirizer _ccz;
public Form1()
{
InitializeComponent();
// Create an instance of ControlColorizer, pass the background color
// the list of Controls and that's all
_ccz = new ControlColorizer(Color.LightYellow, this.TextBox1,
this.TextBox2, this.TextBox3, this.TextBox4);
}
您定製控件類,就像你自定義任何類,則派生自己的類並重寫虛方法。隨意:
using System;
using System.Drawing;
using System.Windows.Forms;
class MyTextBox : TextBox {
protected override void OnEnter(EventArgs e) {
prevColor = this.BackColor;
this.BackColor = Color.Cornsilk;
base.OnEnter(e);
}
protected override void OnLeave(EventArgs e) {
this.BackColor = prevColor;
base.OnLeave(e);
}
private Color prevColor;
}
現在你的窗體上放置任何MyTextBox都會有這樣的行爲,而無需執行事件。儘管使用事件肯定沒有問題。
感謝您的回覆。很多從你的例子中學習。 – FranzQ 2012-03-04 19:05:56
我感謝您的回覆並嘗試了代碼,但收到錯誤消息:名稱父級不存在於當前上下文中。我從每個發佈的例子中學習,所以如果你可以修改你的代碼會非常有幫助。 – FranzQ 2012-03-04 11:25:11
已更新。剪切和粘貼錯誤是最糟糕的。 – 2012-03-04 15:46:32
非常感謝您的努力。現在我要檢查爲什麼代碼不接受'Form1'而不是'this'。 – FranzQ 2012-03-04 18:52:32