2012-03-03 58 views
1

請考慮,我是一個新來的c#。掃描約700個帖子後,我決定發佈一個更多的問題:自動更改活動控件的屬性

在我的Windows窗體(c#)我有一些控件,包括文本框,複選框等。 我想在控件變爲活動狀態時更改背景顏色。 我知道我可以提高每個控件的「輸入」和「離開」事件來改變相應的屬性,但應該有另一種方式。

回答

2

只要輸入和離開事件 - 切換每個顏色。保存保存在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; 
          }; 
    } 
} 
+0

我感謝您的回覆並嘗試了代碼,但收到錯誤消息:名稱父級不存在於當前上下文中。我從每個發佈的例子中學習,所以如果你可以修改你的代碼會非常有幫助。 – FranzQ 2012-03-04 11:25:11

+0

已更新。剪切和粘貼錯誤是最糟糕的。 – 2012-03-04 15:46:32

+0

非常感謝您的努力。現在我要檢查爲什麼代碼不接受'Form1'而不是'this'。 – FranzQ 2012-03-04 18:52:32

1

創建一個類別(例如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); 
} 
1

您定製控件類,就像你自定義任何類,則派生自己的類並重寫虛方法。隨意:

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都會有這樣的行爲,而無需執行事件。儘管使用事件肯定沒有問題。

+0

感謝您的回覆。很多從你的例子中學習。 – FranzQ 2012-03-04 19:05:56