Hallo Martin, hallo Bernd.
Martin hat geschrieben:Anstelle der Übergabe des gesamten Controls mit allen public Elementen (bzw. dem Zwang diese public machen zu müssen) kannst du auch die schreibeText Methode so ändern, dass die immer nur ein einzelnes Element beschreibt, also eine Listbox oder ein Label usw.
BMelchert hat geschrieben:
hatte ich im meinem ersten Beitrag auch schon vorgeschlagen, ist dann aber irgendwie untergegangen.
Das ist nicht untergegangen, sondern in meinem Fall einfach ineffizient und unübersichtlich.
Ich zeig Euch mal warum.
Wie man sieht, werden die Tabs und die Labels für den Clientnamen dynamisch gesetzt.
Um an die Daten heranzugommen, müssen vor dem Anzeigen des Forms einige Funktionen abgearbeitet werden, die den Namen des Servers und die Namen der Clienten auslesen.
Wenn ich das nun so mache wie von Euch vorgeschlagen, würde das dann in etwa so aussehen:
Code: Alles auswählen
Private Sub MainTabUserControl_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
_SucheNamenDesServers(Label1)
_SucheNamenDesServers(Tab1)
_SucheNamenDesErstenClienten(Label2)
_SucheNamenDesErstenClienten(Tab2)
_SucheNamenDesZweitenClienten(Label3)
_SucheNamenDesZweitenClienten(Tab3)
oder
Code: Alles auswählen
Private Sub MainTabUserControl_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
_SucheNamenDesServers(Label1, Tab1)
_SucheNamenDesErstenClienten(Label2. Tab2)
_SucheNamenDesZweitenClienten(Label3, Tab3)
Wenn ich das nun für alle Labels, Tabs, usw. machen würde, hätte ich weit über 100 Anweisungen und (was noch viel schlimmer wäre) entsprechend viele Subs/Module.
Daher ist die Methode mit der Übergabe des kompletten MainTabUserControls besser geeignet.
Hier kann ich das MainTabUserControl als "Inhaltsverzeichnis" missbrauchen und die eigentlichen Funktionen in die entsprechenden Module packen.
Was dann in etwa so aussieht:
Code: Alles auswählen
Private Sub MainTabUserControl_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'Home Server Name ermitteln
_get_HomeServerName(Me)
'Clienten ermitteln
_initial_ClientNames(Me)
...
...
...
End Sub
Code: Alles auswählen
Module get_HomeServerName
Public Sub _get_HomeServerName(ByVal mt As MainTabUserControl)
'Hier steht der Code um den Servernamen zu ermitteln.... ;)
mt.Label1.Text = _HomeServerName
mt.Tab1.Text = _HomeServerName
End Sub
End Module
Funktioniert einwandfrei!
Martin hat geschrieben:Hab den Thread erst jetzt gesehen.
Macht ja nichts.
Warum ich so ungeduldig war, habe ich oben ja schon geschrieben...
Martin hat geschrieben:Wenn du eine Methode (Sub) in einer Formsanwendung anlegst, ist das eine Klassenmethode der Hauptklasse, d.h. die sieht alle Elemente von innen heraus und kann darauf zugreifen (egal ob private oder public).
Wenn die Methode in einem anderen Modul ist, sieht die von der Formsklasse nur die Aussensicht, also die Public Elemente.
Das ist soweit klar.
Es bleibt für mich aber weiterhin die Frage, warum sich Klassenbibliotheken (UserControls) so dermaßen von Formsanwendungen unterscheiden.
Schau Dir einfach mal das Beispielprojekt an, das ich oben angehängt habe.
Ich denke diese Frage werden mir aber nur die Jungs und Mädels von MS beantworten können...
Da VS 2010 schon in den Startlöchern steht, gebe ich die Hoffnung nicht auf, dass MS hier ein bischen nachbessert und das Ganze einheitlich macht.
Wir werden sehen...
Gruß
sTunTe