Controls verdoppeln

  • VB.NET

Es gibt 15 Antworten in diesem Thema. Der letzte Beitrag () ist von PascalN.

    Controls verdoppeln

    Hi,

    also...
    Ich habe ein TabControl, und will über nen Button ne neue TabPage adden lassen wenn man den drückt, was ja kein Problem ist, so nun das Problem:
    Ich will alle Controls rüber kopieren auf die neue Page und den Code des jeweiligen Controls immer gleich lassen, d.h. wenn ich bei Page1 auf nen Button drück passiert das selbe wie wenn ich bei Page3 auf nen Button drücke. Habe das so versucht:

    VB.NET-Quellcode

    1. TabControl1.TabPages.Add("TabPage" & TabControl1.TabPages.Count + 1)
    2. Dim Controlz(TabControl1.TabPages(0).Controls.Count - 1) As Control
    3. TabControl1.TabPages(0).Controls.CopyTo(Controlz, 0)
    4. For Each Control In Controlz
    5. TabControl1.TabPages(TabControl1.TabPages.Count - 1).Controls.Add(Control)
    6. Next


    So die Controls werden zwar kopiert auf die neuste Page, aber von der Page auf der sie davor waren gelöscht, d.h. sie existieren nur 1 mal :/

    Also hab ich es versucht, das ganze in 2 Variablen zu kopiern und auf die Tabpage zu kopiern von der ich es nehm und auf die neure, funktioniert aber auch nicht :x

    Jezt wollt ich fragen obs ne möglichkeit gibt die Controls zu kopiern so das sie auf der alten Page erhalten bleiben? :D

    Freu mich auf antoworten...

    -mfg aspire
    Ich erlaube mir mal, diesen Thread zu pushen, denn ich stehe vor einem ähnlichen Problem und bin per Suchfunktion auf diese Thread gestossen.
    Google-suche hat mir leider nicht viel gebracht. Ich bin zwar auf das Stichwort "serialisieren" gestossen, habe aber keine Ahnung wie ich einzelne Tabpages (resp. die Controls darauf) serialisieren kann und in eine neue (dynamisch erstellte) TabPage zu kopieren. Ich habe lediglich gesehen, dass ganze Klassen serialisiert werden können (<Serializeable()>Public Class ...)



    Grüsse
    Pascal
    Häh, Serialisierung ist doch zum Speichern von Dateien. ?(
    Was haben die mit Controls zu tun? (Noch nie dran gedacht, dass man Controls serialisieren könnte.)
    , dass ganze Klassen serialisiert werden können (<Serializeable()>Public Class ...)
    Mit diesem Code werden die Klassen nicht serialisiert, sondern als serialisierbar gekennzeichnet.
    Wie kann ich denn Controls kopieren, also dass wenn ich eine neue TabPage erstelle (dynamisch), dass alle Controls von einer anderen Tabpage hinzugefügt werden, ohne dass sie auf der ursprünglichen TabPage gelöscht werden?


    Grüsse
    Pascal
    Grundsätzlich mal: Controls verdoppeln geht vom (Windows) System her einfach nicht ! Punkt.

    Hinter jedem (GUI)-Control steckt ein Window mit einem eigenen eindeutigen Handle hwnd , die das Windows-Betriebssystem für das Messaging braucht. Da .NET aber beim Clonen (CopyTo) von Referenztypen nur den Pointer kopiert kann dasselbe Control nicht in 2 ControlCollections sein.

    Vielleicht geht:
    a) TabControl auf ein Panel legen , Buttons unten auf das Panel , so dass sie bei allen Pages zu sehen sind
    b) Eigene Button-Klasse definieren (Font,Size,Heigth,Backgound), beim dynamischen Anlegen immer den gleichen EventHandler anbinden
    Klar: ControlCollection durchlaufen, für jeden Button eine neue Instanz erstellen, wichtige Eigenschaften übertragen (size,text,color,font), entweder manuell oder per Reflection, EventInfo mit Reflection auslesen und übertragen ? Einen Ansatz gabs hier

    Oder beim Wechsel jeder Page Controls auf die aktuelle übertragen ?

    Hmm, war das nun einfacher ?
    Das Problem ist nur, dass es nicht nur Buttons sind.
    Auf die Idee von dir bin ich auch schon gekommen... Jedoch haben die Controls jeweils einen anderen Typ....
    Und da kann ich nicht einfach draufgehen, dass es ein Button ist...
    Im schlimmsten Fall gehe ich die SourceControls mal im Designer manuell durch und erstelle dann auch manuell eine neue Instanz von jedem (Performance = :cursing: )
    Aber danke für deine Hilfe :thumbup:


    Grüsse
    Pascal
    sry, Du kennst Dein spezielles Problem, da kann man nur ratren. Man kann die Controls zum kopieren im Tag kennzeichnen, man kann sie in einer Group oder einem Panel zusammenhalten und das ganze Panel kopieren , usw ....

    Nur 2 identische Controls können einfach nicht 2x zur gleichen Zeit zu sehen sein.
    Ist schon klar :D
    Also ich beschreibe mein Problem sonst noch mal von vorne:
    Ich habe eine TabPage mit einem SplitPanel und einigen Labels, einem TextEditorControl (Eine Art TextBox), einem Listview, etc.
    Nun möchte ich, dass es für den Benutzer möglich ist, mehrere dieser zu öffnen, also ähnlich wie in VS, wo man ja auch mehrere Tabs geöffnet haben kann um mehr oder weniger gleichzeitig an Dingen zu arbeiten.
    Jetzt habe ich mir gedacht, dass ich einfach alle Controls der ersten TabPage durchlaufen lasse und auf einer neuen, dynamisch erzeugten TabPage ebenfalls dynamisch hinzufüge. Funktioniert auch, nur dass die Controls dann auf der ersten TabPage verschwunden sind. Dann habe ich versucht danymisch eine Instanz von jedem Control zu erzeugen (TypeOf, CType, GetType). Hat ebenfalls nicht funktioniert. Ich dachte mir, dass es doch möglich sein muss, dass diese Controls kopiert (wobei das vielleicht der falsche Ausdruck ist) werden können, damit die neue TabPage gleich aussieht vom Design und von der Funktionalität, wie die erste. Aber das ist schwerer als ich gedacht habe.
    Jetzt muss ich wohl einfach manuell eine Instanz zu jedem Control erzeugen (sind halt etwa 15 Stück :D)


    Grüsse
    Pascal
    Reflection wäre das Zauberwort, wie von Kangaroo bereits gepostet, aber ist nicht wirklich eine sehr schöne Lösung...
    stattdessen kannst du dir doch einfach ein UserControl machen, mit allen benötigten Controls, welche auf der TabPage sein sollen, nun musst du immer nur ein UserControl hinzufügen und hast autom. alle Controls...
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    Mit Reflection komm ich nicht weiter...
    Und das mit dem UserControl erstellen ist nicht so einfach, weil ich dynamisch auf verschiedene Methoden und Events der einzelnen Controls zugreifen muss oO
    Vielleicht weiss noch jemand eine Lösung und sonst muss ich das mit den dynamischen Tabs leider lassen :(


    Grüsse
    Pascal
    du kannst auch Events aus dem UserControl ausführen lassen:

    VB.NET-Quellcode

    1. Private Sub d_Click(sender As object, e as eventargs)handles usercontrol1.Button1.Click
    2. End Sub

    (oder natürlich auch mit AddHandler)
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    UserControl.Button.Eigenschaft = Wert...

    die Controls in einem UserControl(und auf Formularen) sind als Friend definiert, d.h. diese sind innerhalb einer Assembly von überall zugreifbar...
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---