Die Community zu .NET und Classic VB.
Menü

Tipp-Upload: VB.NET 0288: IExtenderProvider - "virtuelle" Properties an bestehende Komponenten "patchen"

 von 

Über den Tipp  

Dieser Tippvorschlag ist noch unbewertet.

Der Vorschlag ist in den folgenden Kategorien zu finden:

  • Sonstiges
  • Sprachmerkmale
  • Steuerelemente

Dem Tippvorschlag wurden folgende Schlüsselwörter zugeordnet:
IExtenderProvider

Der Vorschlag wurde erstellt am: 05.07.2008 22:25.
Die letzte Aktualisierung erfolgte am 11.01.2009 12:40.

Zurück zur Übersicht

Beschreibung  

Im Beispiel kann allen Controls und ToolstripItems im Designer ein Sicherheitslevel zugeordnet werden.
Wird das Form von einem User mit niedrigerer Zugriffsberechtigung geöffnet, werden alle Elemente mit höherem Sicherheitslevel vor ihm verborgen.

Schwierigkeitsgrad

Schwierigkeitsgrad 3

Verwendete API-Aufrufe:

Download:

Download des Beispielprojektes [17,97 KB]

' Dieser Source stammt von http://www.activevb.de
' und kann frei verwendet werden. Für eventuelle Schäden
' wird nicht gehaftet.

' Um Fehler oder Fragen zu klären, nutzen Sie bitte unser Forum.
' Ansonsten viel Spaß und Erfolg mit diesem Source!
'
' Beachten Sie, das vom Designer generierter Code hier ausgeblendet wird.
' In den Zip-Dateien ist er jedoch zu finden.

' --------- Anfang Projektgruppe SecurityLevels.sln  ---------
' -------- Anfang Projektdatei SecurityLevels.vbproj  --------
' ----------------- Anfang Datei frmMain.vb  -----------------
' IDE-Voreinstellungen:
' Option Strict On
' Option Explicit On
' Option Infer On

' Projekt-Voreinstellungen
' Imports System
' Imports System.Windows.Forms
' Imports System.Collections.Generic
' Imports System.Linq

Public Class frmMain

    Private _SecurLevels As FormSecurity.Permission() = DirectCast([Enum].GetValues(GetType( _
        FormSecurity.Permission)), FormSecurity.Permission())

    Private Sub frmMain_Load(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Load

        Me.lstSecurityLevel.DataSource = _SecurLevels

    End Sub

    Private Sub btOpenRestricted_Click(ByVal sender As Object, ByVal e As EventArgs) _
              Handles btOpenRestricted.Click

        Dim Frm As New frmRestricted

        Frm.FormSecurity1.ApplyPermission(_SecurLevels(Me.lstSecurityLevel.SelectedIndex))
        Frm.Show()

    End Sub

End Class

' ------------------ Ende Datei frmMain.vb  ------------------
' -------------- Anfang Datei frmRestricted.vb  --------------
Public Class frmRestricted

    ' Da es nur um die Anzeige geht, befindet sich hier keine Funktionalität
End Class

' --------------- Ende Datei frmRestricted.vb  ---------------
' --------------- Anfang Datei FormSecurity.vb ---------------
Imports System.ComponentModel

' Das Attribut weist den Designer an, für alle Komponenten die virtuelle Property
' "Permission on FormSecurity1" anzuzeigen. Die pro Komponente darzustellenden Werte werden
' mit den Methoden "GetPermission" und "SetPermission" verwaltet.
' Dieses tut der Designer nur mit Komponenten, die die in "CanExtend" festgelegten
' Bedingungen erfüllen
<ProvideProperty("Permission", GetType(Component))> Public Class FormSecurity

    Inherits Component
    Implements IExtenderProvider

    Private _Assignments As New Dictionary(Of Component, Permission)

    Public Enum Permission
        [Default]
        Esoteric
        Medicinic
        Financial
        Diplomatic
        CIA
    End Enum

    ' Dieser Interface-Member wird zur Designzeit aufgerufen, und zwar für alle auf dem Form
    ' befindlichen Komponenten. Er checkt, ob der Designer die Pseudo-Property anzeigen
    ' soll.
    Public Function CanExtend(ByVal extendee As Object) As Boolean _
              Implements IExtenderProvider.CanExtend

        Dim Ctl = TryCast(extendee, Control) ' Controls extenden

        If Ctl Is Nothing Then Return TypeOf extendee Is ToolStripItem ' oder ToolStripItems

        ' der .Site.Container-Test schließt z.B. Splitcontainer-Panel aus
        Return Ctl.Site.Container Is Me.Site.Container

    End Function

    <DefaultValue(GetType(Permission), "Default")> _
        <Category("Behavior")> _
        Public Function GetPermission(ByVal target As Component) As Permission

        If _Assignments.TryGetValue(target, GetPermission) Then Exit Function
        Return Permission.Default

    End Function

    <DefaultValue(GetType(Permission), "Default")> _
        <Category("Behaviour")> _
        Public Sub SetPermission(ByVal target As Component, ByVal value As Permission)

        _Assignments(target) = value

    End Sub

    Public Sub ApplyPermission(ByVal Permission As Permission)

        ' Alle Controls/ToolstripItems verstecken, deren Permission zu hoch ist.
        For Each Entry In _Assignments

            If Entry.Value > Permission Then
                If TypeOf Entry.Key Is Control Then
                    DirectCast(Entry.Key, Control).Visible = False

                Else

                    DirectCast(Entry.Key, ToolStripItem).Visible = False
                End If
            End If

        Next

    End Sub

End Class

' ---------------- Ende Datei FormSecurity.vb ----------------
' --------- Ende Projektdatei SecurityLevels.vbproj  ---------
' ---------- Ende Projektgruppe SecurityLevels.sln  ----------

	

Diskussion  

Diese Funktion ermöglicht es, Fragen, die die Veröffentlichung des Tipps betreffen, zu klären, oder Anregungen und Verbesserungsvorschläge einzubringen. Nach der Veröffentlichung des Tipps werden diese Beiträge nicht weiter verlinkt. Allgemeine Fragen zum Inhalt sollten daher hier nicht geklärt werden.

Um eine Diskussion eröffnen zu können, müssen sie angemeldet sein.