我的设置和描述?让他们进入房产网格?

时间:2011-06-02 20:46:20

标签: vb.net propertygrid my.settings

我最近了解了项目的my.settings对象的propertygrid对象用法。我非常喜欢这个,我想知道是否有办法在我的设置中包含描述,以便它们将包含在下面描述面板的propertygrid中?

我发现了一些旧的(2003)codeproj文章,涵盖了这一点,但它需要大量的自定义工作,并希望有一种更简单的方法可以解决。

3 个答案:

答案 0 :(得分:1)

这很简单,不需要任何自定义类。只需在解决方案资源管理器中Settings.Designer.cs的{​​{1}}中打开Settings.settings即可。对于每个属性,您可以通过添加以下内容添加Properties可读的描述:

PropertyGrid

同样可以:

[Description("Your custom description here")]

这些需要[Category("Your custom category here")]

您的说明将完全按预期显示在using System.ComponentModel;中,无需其他工作。

注意:如果重新生成文件,您的更改可能会丢失,因此如果您计划通过自动生成工具进行编辑,那么这只是需要注意的事项。

答案 1 :(得分:0)

您可以将设置包装在一个简单的类中,其中包含应用程序中每个设置的属性,这些属性只是获取/设置设置值并将[Description("Some descr")]属性附加到该包装类中的每个属性以显示描述在PropertyGrid。

答案 2 :(得分:0)

DTools包含一对类,可以更轻松地维护代理设置对象。它定义了与PropertyGrid一起使用的描述和默认属性,并通过在settings属性中查找相应的属性来获取它们的值。这允许您使用“设置设计器”维护描述和默认值,而无需记住在代理设置对象中手动更新这些属性。

''' <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

像这样使用:

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