I have a custom DataGridView
, let's say as such:
public MyGridView : DataGridView
{
public MyGridView()
{
BackgroundColor = Color.Red;
}
}
Now, when I use this control in a project using the designer, for some reason it feels a need to also set the property in the designer.cs file.
So in the designer file, I would have:
this.MyGridView1.BackgroundColor = System.Drawing.Color.FromArgb((byte)(int)255, (byte)(int)0, (byte)(int)0);
The problem me with this is that it prevents me from being able to change the color in the constructor of my MyGridView
, without having to go through all the forms in which I used to control and change it per instance, rendering my custom control useless.
With some properties which offer a virtual getter, this is no problem, but most properties do not have it.
How can I prevent the designer from generating this code?
I should emphasize that this isn't normally the way you do this, the [DefaultValue]
attribute is normally the correct choice. But you are working with a property of type Color, it is not simple to write the attribute for that in a flexible way. The arguments you can pass to an attribute constructor can be only a select few data types, Color isn't one of them. You'd have to craft a string that ColorConverter can understand, that's both ugly and hard to maintain.
PropertyGrid has a secondary way of providing defaults for "difficult" properties, it will also look for specially named private members in the class. Given a property named "Xxxx", it looks for the following:
Which makes this code work:
public class MyGridView : DataGridView {
public MyGridView() {
this.BackgroundColor = DefaultBackgroundColor;
}
public new Color BackgroundColor {
get { return base.BackgroundColor; }
set { base.BackgroundColor = value; }
}
private bool ShouldSerializeBackgroundColor() {
return !this.BackgroundColor.Equals(DefaultBackgroundColor);
}
private void ResetBackgroundColor() {
this.BackgroundColor = DefaultBackgroundColor;
}
private static Color DefaultBackgroundColor {
get { return Color.Red; }
}
}
Note that the ResetBackgroundColor() method is not actually necessary since no special effects are required when the user resets the property, I just included it for completeness.
There is a simpler way to assign DefaultValue to Color:
public class MyGridView : DataGridView
{
public MyGridView()
{
BackgroundColor = Color.Red;
}
[DefaultValue(typeof(Color), "Red")]
public new Color BackgroundColor
{
get { return base.BackgroundColor; }
set { base.BackgroundColor = value; }
}
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With