Changing the properties of the active control automatically

丶灬走出姿态 提交于 2020-01-12 11:08:30

问题


Please consider that im a newcomer to c#. After scanning about 700 posts i decided to post one more question:

On my windows form (c#) I have some controls including textboxes, checkboxes and so on. I want to change the backcolor whenever the controls become active. I know i could raise 'enter' and 'leave' events for each control to change the corresponding properties but there should be another way.


回答1:


Simply hook Enter and Leave events - toggling the color in each. Save the last color saved in OnEnter to use in 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;
                            };
    }
}



回答2:


You customize control classes just like you customize any class, you derive your own class and override the virtual methods. Arbitrarily:

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;
}

Now any MyTextBox you drop on the form will have this behavior without having to implement events. Although there's certainly nothing wrong with using events.




回答3:


Create a class (eg. ControlColorizer) and in its constructor pass:

1) The backcolor for the 'active control' and save to a internal Color variable
2) a variable length Control array

In the contructor add the same event handler for OnEnter and OnLeave on each control
In the OnEnter event set the backcolor
In the OnLeave event set the standard background color

The advantage is all in the use of the class:

1) Declare a global instance in your form class
2) Initialize in the form contructor after the InitializeComponent.
3) Forget everything else. No other code required

So let me explain everything with code:

This will go in a file called 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;
    }

Now, in every form contructor where you need the functionality you have this

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);
}


来源:https://stackoverflow.com/questions/9548217/changing-the-properties-of-the-active-control-automatically

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!