ttvd94
ttvd94

Reputation: 330

How to change a control property (FlatStyle) in base form?

This might be kind of beginner question but I searched and didn't find any clear answer!

The main question is: How to inherit properties of a control (specially FlatStyle) from a base form which doesn't have that control in C#?

Details: I have Form1 inherited from baseForm. baseForm has a Panel and a Label control but no Button. In Form1 I added a button named Button1. How can I change the style of that Button through the baseFrom? I don't want to create a custom control or redesign the button using rectangles or similar ways, but only change that property for all buttons in my application.


UPDATE: I want all of the buttons to be affected, whether they already exist or just added. Not matter in which -if any- container they are.

Upvotes: 0

Views: 6421

Answers (2)

Jcl
Jcl

Reputation: 28272

In baseForm, you could hook the ControlAdded event on the Panel where the Button is to be added, and style appropiately via code. This will work for every form inherited from baseForm.

For example (in baseForm)

public partial class BaseForm : Form
{
  public BaseForm()
  {
    InitializeComponent();
    // "myPanel" is the panel where the button will be added in inherited forms
    myPanel.ControlAdded += myPanel_ControlAdded;
  }

  private void myPanel_ControlAdded(object sender, ControlEventArgs e)
  {
    var button = e.Control as Button;
    if (button != null)
    {
      button.FlatStyle = FlatStyle.Flat;
      button.ForeColor = Color.Red;
    }
  }
}

Just made a really quick test... it works even in design mode:

Screenshot

As an alternative, if you are going to use heavily styled buttons everywhere in your application, you may consider creating a custom control inheriting from Button, and assign the properties there, like:

public class FlatButton : System.Windows.Forms.Button
{
  public FlatButton()
  {
    FlatStyle = FlatStyle.Flat;
  }
}

After building, you will find it in the Toolbox (under "[Your Project's] components" tab), or you can cram it on your own control library (in a different solution) and add it permanently to the Toolbox in Visual Studio.

Upvotes: 3

Jeffrey Wieder
Jeffrey Wieder

Reputation: 2376

You would need to make use of Reflection

You can use a LINQ query to do this. This will query everything on the form that is type Button

var c = from controls in this.Controls.OfType<Button>()
              select controls;
foreach(var control in c)
    control.FlatStyle = FlatStyle.Flat;

Upvotes: 1

Related Questions