none
Fenster und Kontrollen eines Projektes in eine Datenbank schreiben RRS feed

  • Frage

  • Hi,

    ist es möglich, zur Laufzeit den Namen aller Forms und deren Controls, die im Projekt enthalten sind, zu ermitteln und in eine Datenbank zu schreiben? Ich hoffe, ihr wißt, was ich meine...

    Lieben Gruß
    Marcus


    Der erste Tag, an dem ich nichts Neues lerne, wird der Tag sein, an dem sich der Deckel über mir schließt...
    Donnerstag, 12. Mai 2011 12:49

Antworten

  • Hallo Marcus,

    anbei mal ein Beispiel zum Auflisten aller Formulare im aufrufenden Assembly und deren Steuerelemente. Hierarchisch in einem TreeView visualisiert. Statt TreeView käme an der Stelle Deine Ausgabe in eine Datenbank:

    Imports System.Reflection
    
    Public Class Form1
    
     Private Sub Button1_Click(ByVal sender As System.Object, _
                  ByVal e As System.EventArgs _
                     ) Handles Button1.Click
      EnumForms()
     End Sub
    
     Private Sub EnumForms()
      For Each lType As Type In Assembly.GetCallingAssembly().GetTypes()
       If lType.IsSubclassOf(GetType(Form)) Then
        Using lFrm As Control = DirectCast(Activator.CreateInstance(lType), Control)
         EnumControls(lFrm, TreeView1.Nodes)
        End Using
    
       End If
      Next
     End Sub
    
     Private Sub EnumControls(ByVal parent As Control, ByVal nodes As TreeNodeCollection)
      Dim lRoot As New TreeNode(String.Format("{0} ({1})", parent.Name, parent.GetType.Name()))
    
      For Each lCtl In parent.Controls
       EnumControls(lCtl, lRoot.Nodes)
      Next
    
      nodes.Add(lRoot)
     End Sub
    End Class
    

     


    Thorsten Dörfler
    Microsoft MVP Visual Basic
    vb-faq.de
    • Als Antwort markiert mjanz Freitag, 13. Mai 2011 05:37
    Donnerstag, 12. Mai 2011 19:54

Alle Antworten

  • Hallo Marcus,

    ja, ist möglich. Meinst Du alle Formulare, die im Projekt enthalten sind oder alleine die aktuell geöffneten? Was ist der Hintergrund dieses Vorhabens?


    Thorsten Dörfler
    Microsoft MVP Visual Basic
    vb-faq.de
    Donnerstag, 12. Mai 2011 14:09
  • Hallo Thorsten,

    wahrscheinlich mache ich es mir echt schwer, aber ich habe da so eine Rechteverwaltung angefangen. Dabei ist es so, dass ich eine RollenID habe, die am Benutzer hängt. In einer Tabelle stehen die RollenID, der Name einer Form, der Name einer Control und ob die Control (und damit die entsprechende Funktion...) erreichbar sein soll oder nicht. Diese Verwaltung läuft wie geschnitten Börek und ich nutze sie bei allen Fenstern im Projekt. Bisher pflege ich diese Rechte-Tabelle vom Management-Studio aus. Ich möchte aber in meiner Software eine Konfiguration zur Verfügung stellen, so dass man aus der Software heraus Berechtigungsgruppen (Rollen) erstellen kann und dann diesen Gruppen Funktionen zur Verfügung stellt oder eben nicht... Da ich diese Verwaltung in mehreren Projekten einsetzen muss/möchte, möchte ich die Rechte-Tabelle nicht immer mühsam von Hand pflegen müssen. Alle vorhandenen Forms und deren Controls sollen sich quasi von selbst in die Tabelle eintragen, wenn ich eine neue Rolle anlege... Solltest Du eine einfachere Lösung haben, bin ich natürlich für jeden Tipp dankbar...! Danke im Voraus für Deine Hilfe!

    Gruß
    Marcus


    Der erste Tag, an dem ich nichts Neues lerne, wird der Tag sein, an dem sich der Deckel über mir schließt...
    Donnerstag, 12. Mai 2011 17:55
  • Hallo Marcus,

    anbei mal ein Beispiel zum Auflisten aller Formulare im aufrufenden Assembly und deren Steuerelemente. Hierarchisch in einem TreeView visualisiert. Statt TreeView käme an der Stelle Deine Ausgabe in eine Datenbank:

    Imports System.Reflection
    
    Public Class Form1
    
     Private Sub Button1_Click(ByVal sender As System.Object, _
                  ByVal e As System.EventArgs _
                     ) Handles Button1.Click
      EnumForms()
     End Sub
    
     Private Sub EnumForms()
      For Each lType As Type In Assembly.GetCallingAssembly().GetTypes()
       If lType.IsSubclassOf(GetType(Form)) Then
        Using lFrm As Control = DirectCast(Activator.CreateInstance(lType), Control)
         EnumControls(lFrm, TreeView1.Nodes)
        End Using
    
       End If
      Next
     End Sub
    
     Private Sub EnumControls(ByVal parent As Control, ByVal nodes As TreeNodeCollection)
      Dim lRoot As New TreeNode(String.Format("{0} ({1})", parent.Name, parent.GetType.Name()))
    
      For Each lCtl In parent.Controls
       EnumControls(lCtl, lRoot.Nodes)
      Next
    
      nodes.Add(lRoot)
     End Sub
    End Class
    

     


    Thorsten Dörfler
    Microsoft MVP Visual Basic
    vb-faq.de
    • Als Antwort markiert mjanz Freitag, 13. Mai 2011 05:37
    Donnerstag, 12. Mai 2011 19:54
  • Mönsch Thorsten,

    ich werde Dich auf ewig in mein Nachtgebet einschließen! Tausend Dank für Deine Hilfe!

    Gruß
    Marcus


    Der erste Tag, an dem ich nichts Neues lerne, wird der Tag sein, an dem sich der Deckel über mir schließt...
    Freitag, 13. Mai 2011 05:37