Custom Control

I have two questions…

First, I found a attribute for the class that opens the class in code view when double clicked in the solution explorer. I have misplaced the snippet and I have not been able to relocate the attribute on the web.

Second, I would like to update the Registry Attributes Value property in the Properties Windows when the Text property changes. (Design and Runtime)

Imports System.ComponentModel

Imports Microsoft.Win32

#Region "Registry TextBox Control"

<ToolboxBitmap(GetType(TextBox))> _

Public Class RTextBox

Inherits System.Windows.Forms.TextBox

Private m_RegistryAttributes As New RegistryAttributes

Public Sub New()

MyBase.New()

End Sub

<TypeConverter(GetType(RegistryAttributesTypeConverter))> _

Property RegistryAttributes() As RegistryAttributes

Get

Return m_RegistryAttributes

End Get

Set(ByVal Value As RegistryAttributes)

m_RegistryAttributes = Value

End Set

End Property

Private Sub RTextBox_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.TextChanged

m_RegistryAttributes.RegistryValue = Me.Text

End Sub

#Region "Registry Attributes Type Converter"

' The TypeConverter for the RegistryAttributes property

Private Class RegistryAttributesTypeConverter

Inherits TypeConverter

Public Overloads Overrides Function GetProperties(ByVal context As System.ComponentModel.ITypeDescriptorContext, ByVal value As Object, ByVal attributes() As System.Attribute) As System.ComponentModel.PropertyDescriptorCollection

Return TypeDescriptor.GetProperties(GetType(RegistryAttributes))

End Function

Public Overloads Overrides Function GetPropertiesSupported(ByVal context As System.ComponentModel.ITypeDescriptorContext) As Boolean

Return True

End Function

End Class

#End Region

End Class

#End Region

#Region "RegistryAttributes Class"

Public Class RegistryAttributes

Private mRoot As Microsoft.Win32.RegistryHive

Private mKey As String

Private mValue As String

Public Sub New()

mRoot = RegistryHive.LocalMachine

mKey = ""

mValue = ""

End Sub

Public Property Root() As Microsoft.Win32.RegistryHive

Get

Return mRoot

End Get

Set(ByVal Value As Microsoft.Win32.RegistryHive)

mRoot = Value

End Set

End Property

Friend WriteOnly Property RegistryKey() As String

Set(ByVal Value As String)

mKey = Value

End Set

End Property

Public ReadOnly Property Key()

Get

Return mKey

End Get

End Property

Friend WriteOnly Property RegistryValue() As String

Set(ByVal Value As String)

mValue = Value

End Set

End Property

Public ReadOnly Property Value()

Get

Return mValue

End Get

End Property

' Override ToString

Public Overrides Function ToString() As String

Return "(Registry Attributes)"

End Function

End Class

#End Region



Answer this question

Custom Control

  • Rob314159

    First question:

    The attribute is called DesignerCategory("Code")

    Second question:

    I'm not sure exactly what problem you are having. But if you want proper undo support you will need to notify the designer that a certain property has changed.

    You can do this if you create your own designer, subscribe on TextChanged and add the following:

    IComponentChangeService icc = (IComponentChangeService)GetService(typeof(IComponentChangeService)

    icc.OnComponentChanged(this.Component, TypeDescriptor.GetProperties(this.Component)["RegistryAttribute"], oldvalue, newvalue);

    You can also change the value by using a PropertyDescriptor in your control -- which will trigger the right designer behavior.



  • Custom Control