Creating a custom control in Winforms – Part 5 Default Values for interesting datatypes


 Specifying interesting datatypes in the DefaultValue attribute

 

Ok so last time we got off easy with a boolean property – what about something more complex – for example a Color?  How can that be specified?

 

The DefaultValueAttribute has another overload that we can use for this – it allows us to pass in a Type and a string. We just need to figure out what the string should be and we’re in business.  Creating a dummy project, I throw in these few lines of code to see what it should be:

 

TypeConverter colorTypeConverter = TypeDescriptor.GetConverter(typeof(Color));

            string blackColorString = colorTypeConverter.ConvertTo(Color.Black, typeof(string)) as string;

            this.Text = blackColorString;

 

Voila! The title bar says “Black”.  This is the string that should be passed into the overload for the default value attribute. 

        [DefaultValue(typeof(Color),”Black”)]

        public Color PopupColor {

            get {

                return popupColor;

            }

            set {

                popupColor = value;

            }

        }

 

Not so hard, eh?  Now what was all this “TypeConverter” business?  A type converter is a way of “converting” information about an object into another format, e.g. a string.  The most noticeable place you’d run into it is the resx file, when information about your form gets stored as strings in the XML file.  Shawn talks a lot about them here, so I wont go into details. 

 

If the type doesnt already have a type converter, you can add one (if its your class) by creating a new class that inherits from TypeConverter and using the TypeConverter attribute above the class you want to convert.  Ideally, the type converter would need to support converting to and from string.  If all else fails, you can revert back to the ShouldSerialize style.

 

Comments (5)

  1. Why can’t you do the following, the C# compiler allows it:

    [DefaultValue(Color.Black)]

  2. JFo says:

    My impression is that attributes only accept a subset of valid C# syntax. Since Color.Black isnt a public static field, it cant be directly used in an attribute.

    Also you cant create a new object in an attribute – so if you wanted to have a size as the default value, you pretty much have to use the string.

  3. jfo's coding says:

    Custom PaintingPainting best practices ComboBox OwnerDrawLayoutDock layout/Using the Splitter control…

  4. jfo's coding says:

    Custom PaintingPainting best practices ComboBox OwnerDrawLayoutDock layout/Using the Splitter control…