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.
Wir erstellen uns erst einmal ein Benutzersteuerelement namens ctlProperties. 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. ' 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. ' 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 Dieser Tipp wurde bereits 18.445 mal aufgerufen. Voriger Tipp | Zufälliger Tipp | Nächster Tipp
Anzeige
Diesen und auch alle anderen Tipps & Tricks finden Sie auch auf unserer aktuellen vb@rchiv Vol.6 (einschl. Beispielprojekt!) Ein absolutes Muss - Geballtes Wissen aus mehr als 8 Jahren vb@rchiv! - nahezu alle Tipps & Tricks und Workshops mit Beispielprojekten - Symbol-Galerie mit mehr als 3.200 Icons im modernen Look Weitere Infos - 4 Entwickler-Vollversionen (u.a. sevFTP für .NET), Online-Update-Funktion u.v.m. |
sevZIP40 Pro DLL Zippen und Unzippen wie die Profis! Mit nur wenigen Zeilen Code statten Sie Ihre Anwendungen ab sofort mit schnellen Zip- und Unzip-Funktionen aus. Hierbei lassen sich entweder einzelnen Dateien oder auch gesamte Ordner zippen bzw. entpacken. Tipp des Monats November 2024 Dieter Otter WAVE-Dateien aufnehmen Ein Code-Ausschnitt, mit dem sich WAVE-Dateien in verschiedenen Aufnahmequalitäten aufnehmen lassen. Access-Tools Vol.1 Über 400 MByte Inhalt Mehr als 250 Access-Beispiele, 25 Add-Ins und ActiveX-Komponenten, 16 VB-Projekt inkl. Source, mehr als 320 Tipps & Tricks für Access und VB |
||||||||||||||||
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein. |