Rubrik: Controls | VB-Versionen: VB.NET | 23.07.07 |
Control Properties, UITypeEditor Verschiedene Arten Properties eines Controls anzuzeigen | ||
Autor: Christian Schleinkofer | Bewertung: | Views: 18.408 |
ohne Homepage | System: WinNT, Win2k, WinXP, Win7, Win8, Win10, Win11 | Beispielprojekt auf CD |
Viele haben sich sicher schon gefragt, wie man Properties (Eigenschaften) eines UserControls im PropertyGrid (Eigenschaftenfenster) von VB.NET anzeigen kann. Im Netz sind viele Beispiele, die aber entweder nur den einfachen Weg für Standardproperties zeigen oder aber sehr komplex sind. Stichwort UITypeEditor.
Mit diesem Tipp will ich 4 verschiedene Arten zeigen, wie man auf einfachem Weg Properties eines Controls nach außen führen kann.
- Standarproperty
- Listenansicht (Auflistung)
- Eigenes Control in einem DropDown Menü
- Anzeige eines Formulars zum eintragen komplexer Werte
Wir erstellen uns erst einmal ein Benutzersteuerelement namens ctlProperties.
Im oberen Teil des Codes (oberhalb von Public Class [Controlname]) fügen wir folgende Zeilen ein, damit wir uns später ein wenig Tipparbeit sparen.
Option Strict On Option Explicit On Imports System Imports System.ComponentModel Imports System.ComponentModel.Design Imports System.Drawing Imports System.Drawing.Drawing2D Imports System.Drawing.Design Imports System.Windows.Forms Imports System.Diagnostics Imports System.Windows.Forms.ComponentModel Imports System.Windows.Forms.Design Public Class ctlProperties
Der ganze nachfolgende Code muss innerhalb der Klasse des Steuerelements.
1. Fangen wir mal mit dem einfachsten an, dem Standardproperty
' 1. Standard Property ' Eine Variable, die einen String aufnehmen kann. Private mPropertyOne As String = "" ' Unser Property. Liest den Wert aus und speichert ihn wieder. Public Property PropertyOne() As String Get Return mPropertyOne End Get Set(ByVal value As String) mPropertyOne = value End Set End Property
2. Nun wollen wir mal schauen was notwendig ist, um eine Property Listenauswahl zu machen.
Auch das ist noch nicht schwierig.
' 2. Property Auswahlliste ' Das sind später die Einträge, die zur Auswahl stehen. Public Enum EPropertyTwo EntryOne EntryTwo EntryThree EntryFour End Enum ' Wieder eine neue Variable, die die Werte der zuvor ' angelegten Liste aufnehmen kann. Private mPropertyTwo As EPropertyTwo ' Und hier wieder unser Property, das nach außen geführt ' wird, Einträge speichert, liest und anzeigt. Public Property PropertyTwo() As EPropertyTwo Get Return mPropertyTwo End Get Set(ByVal value As EPropertyTwo) mPropertyTwo = value End Set End Property
Ich denke mal das auch das noch nicht schwierig war.
Kommen wir nun zu Punkt 3, dem einbinden eines USerControls, das in einer DropDown Liste aufgeklappt werden kann. Hier in diesem Beispiel ist es eine CheckedListBox.
' 3. Eigenes Steuerelement beim Ausklappen anzeigen ' Zuerstmal brauchen wir eine Klasse, die von UITypeEditor ' ableitet. Dort überschreiben wir die Methoden ' GetEditStyle und EditValue Public Class CPropertyThree Inherits UITypeEditor ' Wird gebraucht um das Steuerelement dann azuzeigen. Private edSvc As IWindowsFormsEditorService ' CheckedListbox, die dann im Dropdown auftauchen soll. Dim lstConditions As CheckedListBox Public Overrides Function GetEditStyle( _ ByVal context As ITypeDescriptorContext) As UITypeEditorEditStyle ' Überprüfung auf das vorhandensein und Rückgabe des Stils, was ' angezeigt werden soll. In diesem Fall ein DropDown If Not context Is Nothing AndAlso Not context.Instance Is Nothing Then Return UITypeEditorEditStyle.DropDown End If ' Ist nichts vorhanden ,dann machen wir an dieser Stelle nichts. Return UITypeEditorEditStyle.None End Function Public Overrides Function EditValue( _ ByVal context As ITypeDescriptorContext, _ ByVal provider As System.IServiceProvider, _ ByVal value As [Object]) As [Object] If (Not (context Is Nothing) And _ Not (context.Instance Is Nothing) And _ Not (provider Is Nothing)) Then Dim nIdx As Integer Dim nIdx2 As Integer Dim nIdx3 As Integer ' Überprüfung ob schon eine Kopie der CheckedListbox da ist. If lstConditions Is Nothing Then ' Wenn nein, dann neue Kopie erzeugen. lstConditions = New CheckedListBox ' Setzen verschiedener Werte für die Anzeige. lstConditions.Height = 125 lstConditions.ThreeDCheckBoxes = False lstConditions.CheckOnClick = True lstConditions.BackColor = Color.GhostWhite lstConditions.Items.Add("A") lstConditions.Items.Add("B") lstConditions.Items.Add("C") lstConditions.Items.Add("D") lstConditions.Items.Add("E") lstConditions.Items.Add("F") lstConditions.Items.Add("G") End If ' Value ist der Wert, der im PropertyGrid angezeigt wird. ' Wenn dieser Nothing ist dann auf Leerstring setzen. If value Is Nothing Then value = "" ' durchgehen des Strings und markieren der Einträge ' in der CheckedListBox For nIdx = 0 To value.ToString.Length - 1 nIdx2 = lstConditions.FindStringExact( _ value.ToString.Substring(nIdx, 1)) lstConditions.SetItemChecked(nIdx2, True) Next edSvc = CType(provider.GetService( _ GetType(IWindowsFormsEditorService)), IWindowsFormsEditorService) If Not (edSvc Is Nothing) Then ' Hinzufügen der CheckedListBox zum DropDown edSvc.DropDownControl(lstConditions) End If Dim sDisplayConditions As String = "" With lstConditions For nIdx3 = 0 To .CheckedItems.Count - 1 ' Aus den ausgewählten Einträgen einen String basteln. sDisplayConditions += .CheckedItems.Item(nIdx3).ToString Next End With ' Den String zurück geben. Return sDisplayConditions End If End Function End Class ' Variable als String für Aufnahme des ' Wertes aus der Klasse Private mPropertyThree As String = "" ' Editor = Angabe der Klasse und UITypeEditor. ' Damit weiß er das er die Klasse nehmen soll. <System.ComponentModel.Editor(GetType(CPropertyThree), _ GetType(System.Drawing.Design.UITypeEditor))> _ Public Property PropertyThree() As String ' Wieder ein normales Property zum anzeigen des Wertes. Get Return mPropertyThree End Get Set(ByVal value As String) mPropertyThree = value End Set End Property
So, das wäre geschafft; dann mal ab zum letzen Teil, und dieser ist sogar noch leichter als Teil 3.
4. Anzeige eines Formulars zum eintragen komplexer Werte
' 4 Eigenes Formular anzeigen um Werte einzutragen ' Wieder eine Klasse, deren Methoden wir überschreiben. Public Class CPropertyFour Inherits UITypeEditor Public Overrides Function GetEditStyle( _ ByVal context As ITypeDescriptorContext) As UITypeEditorEditStyle If Not context Is Nothing AndAlso Not context.Instance Is Nothing Then ' Genau wie 3. Beispiel nur angabe von Stil Modal Return UITypeEditorEditStyle.Modal End If Return UITypeEditorEditStyle.None End Function Public Overrides Function EditValue( _ ByVal context As ITypeDescriptorContext, _ ByVal provider As System.IServiceProvider, _ ByVal value As [Object]) As [Object] ' hier drin aufruf des Formulars und Rückgabe des Wertes. Dim frmAnzeige As New OpenFileDialog If frmAnzeige.ShowDialog = DialogResult.OK Then Return frmAnzeige.FileName End If End Function End Class ' String, der die Auswahl aufnehmen kann. Private mPropertyFour As String <Editor(GetType(CPropertyFour), GetType(UITypeEditor))> _ Public Property PropertyFour() As String ' Angabe des Editors wie in Beispiel 3 ' Property für den Wert. Get Return mPropertyFour End Get Set(ByVal value As String) mPropertyFour = value End Set End Property
End Class
Das wars auch schon. Ich hoffe, dass ich durch diesen Tipp mal ein bisschen einen Einblick in das Geschehen geben konnte. Wenn noch Fragen sind dann gerne im Forum oder über
meine E-Mail Adresse