WindowsForms Attribute aus einer Komponente auslesen

  • VB.NET
  • .NET (FX) 4.0

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von J.Herbrich.

    WindowsForms Attribute aus einer Komponente auslesen

    Jenni Jenni und Gepriesen sei Das Rauhe Haus,

    Also, folgendes Problem, ich will eine Komponente haben die bestimmte Dinge tut. Ziel ist es jetzt die Attribute (System.Attribute) der Windows Form die die Komponente endhällt (hostest) auszulesen. Das Auslesen funktioniert so weit auch ganz gut, nur eben nicht von der Windows Form.

    Hier mein code
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System.Reflection
    2. Public Class LeviatahnHandler
    3. Public Sub foobaa()
    4. Me.Leviathan0x00()
    5. End Sub
    6. Protected Sub Leviathan0x00()
    7. Dim x As New List(Of Object)
    8. x.AddRange(Me.Container.GetType.GetCustomAttributes(False))
    9. For Each jh As Object In x
    10. If (TypeOf jh Is HallAdressAttribute) Then
    11. MsgBox(CType(jh, HallAdressAttribute).WilhelmstiftValue)
    12. End If
    13. Next
    14. End Sub
    15. End Class


    Wie dem Code zu endnehmen bediene ich mich den ISiteContainer aus der Container Eigenschaft. Gut, der Code wird auch ausgeführt und es gibt in der Liste exakt 1 Eintrag. Irgendwas mit SecurityProviderAttribute was .net internas sind. Aber nichts aus der Windows Form. Ok, nach meinen Verständnis sollte System.Windows.Forms.Form die ISiteContainer Schnittstelle implementieren um das Component zu Hosten. Happy. Aber dann sollten der Logik nach alle Attribute auftauchen. Hoffe jemand kann helfen.

    LG, Herbrich
    @J.Herbrich Was ganz genau ist Me.Container?
    Und:
    Ich würde das Leviathan nennen. ;)
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Jenni Jenni,

    ​Ich würde das Leviathan nennen.


    Danke, werde ich abändern :)

    ​@J.Herbrich Was ganz genau ist Me.Container?


    In dieser Eigenschaft ist das Host Object der Komponente abrufbar. (Es ist eine system.componentmodel.component Klasse, erstellt mit Visual Studio, die Vererbung ist in einer von Designer generierten Unterdatei xyz.designer.vb) jedoch scheint es so zu sein das dieser Container nicht die WindowsForm selber ist.

    Was ich jetzt machen werde ist die MSDN durchgehen und System.Windows.Forms.Form die Doku durchlesen.

    LG, Herbrich
    Jenni Jenni,

    Ok vielen Dank. Ok, das wollte ich Wissen. Gibt es da einen Eleganten weg? Meine Idee wäre jetzt den Component einfach eine Eigenschaft zu geben diese wiederum die Form zugewiesen bekommt von der FormXYZ.vb aus. Ist dann natürlich unschön weil ich dann in der Load Methode jede Mal selbst Hand anlegen muss.

    Altanativ, einen eigenen ISiteContainer implementieren wo die Components drinnen sitzen und diesen dann bei Lod oder Sub New gegen den Integrierten Container zu ersetzen. Auf jeden Fall danke @ErfinderDesRades für die Info :)

    LG, J. Herbrich
    Jenni Jenni,

    Ja Nette Idee aber dann weiß ich zwar welche Forms gerade offen sind, jedoch nicht welche Form das Component selbst hostet. Der Zweck ist relativ einfach. Ich will Attribute auslesen, und UserControls manipulieren. Mir ist eine Idee gekommen. Also, so wie ich es sehe hat die Windows Form ja eine eigenschaft Components oder ähnlich. Components=Me sollte das Problem doch lösen oder nicht? Dann muss ich halt einen eigenen IComponentContainer implementieren. Was aber relativ easy sein sollte. Option a Code von Microsoft klauen (ist ja Open Source auf MSDN einzusehen) und dann einfach in die FormXYZ.vb weil dann der Container die Form selbst ist was dann wiederum dazu führt das ich an die Attribute kommen sollte.

    Weitere Überlegung, kann man mit System.Reflection irgendwie herausfinden in welcher Klasse die Ausgeführte Instanz gehostet wird. Dann sollte man (weil ComponentContainer teil der WinForm) auf die WinForm kommen, dann einfach mit CType den Typen von was auch immer in die WinForm Konvertieren und fertig.

    LG, J Herbrich
    Jenni Jenni und sry für die späte Antwort,

    An sich ja gute Idee. Hmm wenn 2 Identische Forms offen sind könnte es etwas schwer werden aber ich glaube das ist dann auch der Weg den ich gehen werde. Ich lasse den Component Handler eine GUID in SubNew erstellen und dann jede Windows Form nach den Component durchsuchen und auf die GUID gegenprüfen. So kann ein und die selbe Form Klasse mehrfach geöffnet sein und ich habe trotzdem kein Chaos bei den Component Instanzen.

    LG, J Herbrich
    Jenni Jenni,

    Ich habe durch Zufall auf der MSDN was gefunden social.msdn.microsoft.com/Foru…-container?forum=winforms, der erste Versuch ist Fehlgeschlagen aber ich denke der IComponentHost ist ja die WindowsForm. Wie auch immer, bin über Feedback und weitere Ideen gespannt. Sollte ich es hinbekommen werde ich den Code hier Posten :)

    LG, J Herbrich