2

I recently learned of the propertygrid object usage with the my.settings object for a project. I like this very much and I was wondering if there is a way to include descriptions with my settings so that they will be included in the propertygrid in the lower description panel?

I found a couple of old (2003) codeproj articles that covers this but it requires a lot of custom work and was hoping that there has been an easier method to come around.

jmoreno
  • 12,752
  • 4
  • 60
  • 91
TWood
  • 2,563
  • 8
  • 36
  • 58

3 Answers3

1

This is very simple to do and doesn't require any custom classes. Just open Settings.Designer.cs in Settings.settings in Propertiesin your Solution Explorer. For every property you can add a description readable by PropertyGrid by adding:

[Description("Your custom description here")]

The same can be done with:

[Category("Your custom category here")]

These require using System.ComponentModel;.

Your descriptions will show up exactly as expected in your PropertyGrid with no other work required.

NOTE: If the file is regenerated your changes will probably be lost, so that is just something to be mindful if you plan on editing through the auto-generate tool.

Kevin Klute
  • 450
  • 1
  • 4
  • 22
0

DTools includes a pair of classes that make it easier to maintain your proxy settings object. It defines description and default attributes that work with the PropertyGrid and get their value by looking up the corresponding attribute in the settings property. This allows you to maintain description and default value using the Settings Designer without having to remember to update those attributes manually in your proxy settings object.

''' <summary><see cref="DescriptionAttribute"/> that takes its value from <see cref="System.Configuration.SettingsDescriptionAttribute"/></summary>
''' <author www="http://dzonny.cz">Đonny</author>
''' <version version="1.5.2" stage="RC"><see cref="VersionAttribute"/> and <see cref="AuthorAttribute"/> removed</version>
Public Class SettingsInheritDescriptionAttribute : Inherits DescriptionAttribute
    ''' <summary>CTor</summary>
    ''' <param name="Settings">The data type that contains property with name specified in <paramref name="Property"/></param>
    ''' <param name="Property">Name of the property which's <see cref="SettingsDescriptionAttribute"/> initializes this attribute</param>
    ''' <param name="AlternateDescription">Alternative description used in case of failure of getting description form specified property</param>
    Public Sub New(ByVal Settings As Type, ByVal [Property] As String, Optional ByVal AlternateDescription As String = "")
        '#If VBC_VER >= 9 Then
        MyBase.New(If(AlternateDescription = "", [Property], AlternateDescription))
        '#Else
        '            MyBase.New(iif(AlternateDescription = "", [Property], AlternateDescription))
        '#End If
        Me.Settings = Settings
        Me.Property = [Property]
    End Sub
    ''' <summary>The data type that contains property with name spacified in <see cref="[Property]"/></summary>
    Private Settings As Type
    ''' <summary>Name of the property which's <see cref="SettingsDescriptionAttribute"/> initializes this attribute</summary>
    Private [Property] As String
    ''' <summary>Gets or sets the string stored as the description.</summary>
    ''' <returns>The string stored as the description. The default value is an empty string ("").</returns>
    Public Overrides ReadOnly Property Description() As String
        Get
            Dim sds As Object() = Settings.GetProperty([Property]).GetCustomAttributes(GetType(SettingsDescriptionAttribute), True)
            If sds IsNot Nothing AndAlso sds.Length > 0 Then
                Return CType(sds(0), SettingsDescriptionAttribute).Description
            Else
                Return MyBase.DescriptionValue
            End If
        End Get
    End Property
End Class
''' <summary><see cref="DefaultValueAttribute"/> that takes its value from <see cref="System.Configuration.DefaultSettingValueAttribute"/></summary>
''' <author www="http://dzonny.cz">Đonny</author>
''' <version version="1.5.2" stage="RC"><see cref="VersionAttribute"/> and <see cref="AuthorAttribute"/> removed</version>
Public Class SettingsInheritDefaultValueAttribute : Inherits DefaultValueAttribute
    ''' <summary>CTor</summary>
    ''' <param name="Settings">The data type that contains property with name defined in <paramref name="Property"/></param>
    ''' <param name="Property">Name of property from which's <see cref="DefaultSettingValueAttribute"/> this attribute is initialized</param>
    ''' <param name="Type">The data type of the value</param>
    ''' <param name="AlternateDefaultValue">Alternative default value used when fetching fails</param>
    Public Sub New(ByVal Settings As Type, ByVal [Property] As String, ByVal Type As Type, Optional ByVal AlternateDefaultValue As String = "")
        MyBase.New(Type, AlternateDefaultValue)
        Me.Settings = Settings
        Me.Property = [Property]
        Me.ValueType = Type
    End Sub
    ''' <summary>CTor for default values of <see cref="String"/> type</summary>
    ''' <param name="Settings">The data type that contains property with name defined in <paramref name="Property"/></param>
    ''' <param name="Property">Name of property from which's <see cref="DefaultSettingValueAttribute"/> this attribute is initialized</param>
    Public Sub New(ByVal Settings As Type, ByVal [Property] As String)
        Me.New(Settings, [Property], GetType(String))
    End Sub
    ''' <summary>Contains value of the <see cref="Settings"/> property</summary>
    <EditorBrowsable(EditorBrowsableState.Never)> Private _Settings As Type
    ''' <summary>Contains value of the <see cref="[Property]"/> property</summary>
    <EditorBrowsable(EditorBrowsableState.Never)> Private [_Property] As String
    ''' <summary>Contains value of the <see cref="ValueType"/> property</summary>
    <EditorBrowsable(EditorBrowsableState.Never)> Private _ValueType As Type
    ''' <summary>Gets the default value of the property this attribute is bound to.</summary>
    ''' <returns>An <see cref="System.Object"/> that represents the default value of the property this attribute is bound to.</returns>
    ''' <remarks>Default values can be obtained if stored in form that can be directly returned or if stored as XML-serialized values.</remarks>
    Public Overrides ReadOnly Property Value() As Object
        Get
            Dim sds As Object() = Settings.GetProperty([Property]).GetCustomAttributes(GetType(DefaultSettingValueAttribute), True)
            If sds IsNot Nothing AndAlso sds.Length > 0 Then
                Try
                    Dim mySerializer As Xml.Serialization.XmlSerializer = New Xml.Serialization.XmlSerializer(ValueType)
                    Dim stream As New System.IO.StringReader(CType(sds(0), DefaultSettingValueAttribute).Value)
                    Return mySerializer.Deserialize(stream)
                Catch
                    Dim a As New DefaultValueAttribute(ValueType, CType(sds(0), DefaultSettingValueAttribute).Value)
                    Return a.Value
                End Try
            Else
                Return MyBase.Value
            End If
        End Get
    End Property
    ''' <summary>The data type that contains property with name defined in <see cref="[Property]"/></summary>
    Public Property Settings() As Type
        Get
            Return _Settings
        End Get
        Protected Set(ByVal value As Type)
            _Settings = value
        End Set
    End Property
    ''' <summary>Name of property from which's <see cref="DefaultSettingValueAttribute"/> this attribute is initialized</summary>
    Public Property [Property]() As String
        Get
            Return [_Property]
        End Get
        Protected Set(ByVal value As String)
            [_Property] = value
        End Set
    End Property
    ''' <summary>The data type of the value</summary>
    Public Property ValueType() As Type
        Get
            Return _ValueType
        End Get
        Protected Set(ByVal value As Type)
            _ValueType = value
        End Set
    End Property
End Class

Use it like this:

Public Class ProxySettings
    ''' <summary>Wraps <see cref="My.MySettings.SomeSetting"/> property</summary>
    <SettingsInheritDescription(GetType(My.MySettings), "SomeSetting")> _
    <SettingsInheritDefaultValue(GetType(My.MySettings), "SomeSetting")> _
    Public Property SomeSetting() As Decimal
        Get
            Return My.Settings.SomeSetting 
        End Get
        Set(ByVal value As Decimal)
            My.Settings.SomeSetting = value
        End Set
    End Property
End Class
Pauli Price
  • 4,187
  • 3
  • 34
  • 62
0

You could wrap the settings in a simple class with properties for each setting you have in your application that simply gets/sets the setting value and attach the [Description("Some descr")] attribute to each property in that wrapper class to show the descriptions in the PropertyGrid.

lee-m
  • 2,269
  • 17
  • 29