Prevent Winforms Designer from Generating Property Values for Inherited Controls

前端 未结 4 1270
清酒与你
清酒与你 2020-12-10 08:24

I have a custom DataGridView, let\'s say as such:

public MyGridView : DataGridView
{
    public MyGridView()
    {
         BackgroundColor = Co         


        
4条回答
  •  悲哀的现实
    2020-12-10 09:16

    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:

    • DefaultXxxx, a property with just a getter that returns the default value
    • ResetXxxx(), a method that can run when the user selects the Reset context menu item
    • ShouldSerializeXxxx(), a method that should return false if the value of the property should not be persisted.

    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.

提交回复
热议问题