Designer Problem mit Tabcontrol / UserControl oder Formular

  • VB.NET

Es gibt 13 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Designer Problem mit Tabcontrol / UserControl oder Formular

    Tach auch,

    ich habe in meiner Anwendung ein paar Formulare gemacht.
    Diese sollten eigentlich im Hauptformular als Unterformular im Tabcontrol eingebunden werden.
    Jedoch fand ich nun keine Möglichkeit dies so auch zu machen.
    Da es nicht gerade wenige Unterformulare sind, wollte ich es schon irgendwie so machen.
    Jedoch kann ich das jeweils über ein UserControl doch so lösen.

    Meine Frage: Ist mein Weg über das UserControl der richtige oder bin ich damit eher auf dem Holzweg?
    Mit freundlichen Dinges

    Lupus
    P.S: bei allen meine Fragen beziehen sich auf das arbeiten mit Visual Studio 2019 auf Win 10/64 bit und MySQL
    Wenn Du ein SubForm im TabControl (genauer: auf einer TabPage) anzeigen lassen willst, musst Du es dieser "nur" hinzufügen:

    VB.NET-Quellcode

    1. ZielTabPage.Controls.Add(New Form1 With {.TopLevel = False, .Visible = True, .Dock = DockStyle.Fill})

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    Lupusverlach schrieb:

    Meine Frage: Ist mein Weg über das UserControl der richtige oder bin ich damit eher auf dem Holzweg?
    Das ist prinzipiell egal, ein UserControl macht mehr Sinn..
    Du kannst im Design-Code die Forms zu UserControls um-deklarieren und ich glaube zwei Zeilen Designber-Code löschen.
    Wenn Du diesen Forms/UserControls ein geeignetes Interface mitgibst, lassen sie sich im Code der Anwendung viel besser bedienen.
    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!

    Lupusverlach schrieb:

    Meine Frage: Ist mein Weg über das UserControl der richtige oder bin ich damit eher auf dem Holzweg?
    UserControls sind der richtige Weg, und die kann man nach Kompilieren auch aus der Toolbox aufs Tab ziehen wie jedes andere Control.

    Forms kann man theoretisch auch aufs Tab tun, sind aber nicht dazu vorgesehen. Sieht man schon daran, dass man sie nicht aufs Tab ziehen kann.
    Ein Form ist dafür vorgesehen, ein Form zu sein: Also man kann es öffnen, schliessen, resizen, minimieren, es hat einen Titelbalken, an dem man es draggen kann,...
    Das alles hat ja eingebunden in einen Tab keinerlei Bedeutung.

    ErfinderDesRades schrieb:

    UserControls sind der richtige Weg, und die kann man nach Kompilieren auch aus der Toolbox aufs Tab ziehen wie jedes andere Control.


    Na super, muss ich mich nun selbst mal loben (mach ja sonst keiner). genau so habe ich es auch gemacht, endlich mal alles richtig gemacht :thumbsup:
    Mit freundlichen Dinges

    Lupus
    P.S: bei allen meine Fragen beziehen sich auf das arbeiten mit Visual Studio 2019 auf Win 10/64 bit und MySQL
    Eine Form einzubetten, so wie von @VaporiZed vorgeschlagen, wäre genau so „richtig“.

    Ein Vorteil der Form wäre, dass man Sie auch dem Control wieder raus holen kann, für z.b. einen Vollbildmodus.
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    Irgendwie ist mir hier eine Antwort verschwunden oder ich habe vergessen auf Absenden zu drücken ?(

    VaporiZed schrieb:

    ZielTabPage.Controls.Add(New Form1 With {.TopLevel = False, .Visible = True, .Dock = DockStyle.Fill})


    Danke für die Antwort, also muss das im Code eingetragen werden, so wie hier bei mir es nun so aussieht.

    VB.NET-Quellcode

    1. Me.TabPageSkills.Controls.Add(New FrmSkills With {.TopLevel = False, .Visible = True, .Dock = DockStyle.Fill})

    Nachteil, im Designer kann man es nicht sehen und evtl. einfach mal so ein bissel verschieben. Sehe ich das richtig?

    Also das Form:

    soll da eingebunden werden

    Das Ergebnis sieht sehr unschön aus :(



    mrMo schrieb:

    Eine Form einzubetten, so wie von @VaporiZed vorgeschlagen, wäre genau so „richtig“. Ein Vorteil der Form wäre, dass man Sie auch dem Control wieder raus holen kann, für z.b. einen Vollbildmodus.


    Das ist tatsächlich ein Vorteil, bzw. eröffnet Möglichkeiten von denen ich nichts wusste. Muss ich mir überlegen, sicherlich nicht von Vorteil für alle Unterformulare
    Mit freundlichen Dinges

    Lupus
    P.S: bei allen meine Fragen beziehen sich auf das arbeiten mit Visual Studio 2019 auf Win 10/64 bit und MySQL

    Lupusverlach schrieb:

    Das Ergebnis sieht sehr unschön aus
    Definiere unschön.
    Verstehe Post #3 und füge eine Kopie dieser Form als UserControl[b][/b] in eine TabPage ein und vergleiche das Aussehen beider.
    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!
    FrmSkills ist jetzt im Tab-Reiter Skillprofile. Aufgabenziel aus Post#1 erfüllt. Wenn das jetzt doch nicht das ist, was Du willst, solltest Du an der Formulierung des Wunsches arbeiten.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Meinst du beim Aussehen die Grundform einer Form? Also sprich obere Leiste, Buttons, Ränder, etc.? Das wäre ja Design der Form und die müsstest du ja, genauso als wenn die Form als einzelne Form steht, einfach ausblenden können in den Eigenschaften. Denn die Eigenschaften, die dir angezeigt werden wenn du deine eingebundene Form im Focus hast sind die selben wie bei einer freistehenden Form.
    Nach dem ihr mir alle ein bissel geholfen habt, habe ich einmal etwas rumgewerkelt und hänge mal das Ergebnis hier an.
    Jedoch habe ich beim Öffnen vom FormHaupt jedes Mal eine Fehlermeldung. Wobei nach dem Kompilieren funktioniert alles. Was läuft da wieder schief?




    mrMo schrieb:

    Ein Vorteil der Form wäre, dass man Sie auch dem Control wieder raus holen kann, für z.b. einen Vollbildmodus.

    Ein Aspekt der doch gewissen neue Möglichkeiten eröffnet.

    RodFromGermany schrieb:

    Verstehe Post #3 und füge eine Kopie dieser Form als UserControl in eine TabPage ein und vergleiche das Aussehen beider.

    Das habe ich jetzt nicht ganz verstanden.
    Ich soll von dem Unterformular eine Kopie machen und diese als UserContol einfügen?

    VaporiZed schrieb:

    FrmSkills ist jetzt im Tab-Reiter Skillprofile. Aufgabenziel aus Post#1 erfüllt. Wenn das jetzt doch nicht das ist, was Du willst, solltest Du an der Formulierung des Wunsches arbeiten.

    Ich wusste schon was ich will, jedoch wusste ich ja nicht was ich als Antwort bekomme. Erst dadurch sah ich wie ein mögliches Ergebnis aussehen kann. Das bringt dann einfach wieder neue Fragen.

    ThomasG82 schrieb:

    Meinst du beim Aussehen die Grundform einer Form? Also sprich obere Leiste, Buttons, Ränder, etc.? Das wäre ja Design der Form und die müsstest du ja, genauso als wenn die Form als einzelne Form steht, einfach ausblenden können in den Eigenschaften. Denn die Eigenschaften, die dir angezeigt werden wenn du deine eingebundene Form im Focus hast sind die selben wie bei einer freistehenden Form.

    Du hast ich verstanden.

    Fazit bisher:
    Ob nun ein richtiges Formular oder eine UserControl als Unterformular verwendet wird ist demnach irgendwie fast egal.
    Einfacher erscheint mir jedoch die Lösung mit dem UserControl es zu machen. Das kann ich im Designer hin und herschieben wo ich es gerne hätte incl der richtigen Größe.


    Beim Verwenden von einem Formular kann ich das nicht, das wird erst zur Laufzeit eingebunden. Ferner muss ich hier, die Eigenschaften zusätzlich noch selbst einstellen, je nachdem ob ich es auch noch zusätzlich als einzelnes Formular verwende möchte oder nicht.
    Bis jetzt ist es einfach im TabPageSkills oben links angedockt und nimmt die ganze Höhe vom TabPageSkills ein. Kann man das einstellen?
    Oder kann ich ein Panel auf TabPageSkills einfügen und das Formular dort passend einbinden?


    Im Hauptform habe ich nun folgenden Code stehen. Hierzu noch eine Frage.
    Mit dem Me.TabPageSkills.Controls.Add(New FrmSkills With {.TopLevel = False, .Visible = True, .Dock = DockStyle.Left}) kann ich zwar das FrmSkills einbinden, aber kann ich auch vom Hauptformular aus die Eigenschafen manipulieren für das eingebundene FrmSkills?
    Alternative würde ich eben beim Öffnen vom FrmSkills jeweils die Eigenschaften einstellen müssen.


    Der Code im FrmHauptsieht derzeit so aus:

    VB.NET-Quellcode

    1. Option Strict On
    2. Public Class FrmHaupt
    3. Private Sub Frmhaupt_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    4. Me.AnsprechpartnerTableAdapter.Fill(Me.DataSet1.Ansprechpartner)
    5. Me.KundenTableAdapter.Fill(Me.DataSet1.Kunden)
    6. Me.TabPageSkills.Controls.Add(New FrmSkills With {.TopLevel = False, .Visible = True, .Dock = DockStyle.Left})
    7. ' wie kann man an der Stelle die Eigenschaften von FrmSkills einstellen?
    8. End Sub
    9. Private Sub BtnSkillForm_Click(sender As Object, e As EventArgs) Handles BtnSkillForm.Click
    10. If FrmSkills.Visible = False Then
    11. FrmSkills.Show()
    12. FrmSkills.Text = "Das Unterformuar alleine geöffnet"
    13. FrmSkills.FormBorderStyle = FormBorderStyle.Sizable
    14. Else
    15. FrmSkills.Activate()
    16. End If
    17. End Sub
    18. End Class


    Projektanhang von EXE und unnötigem Ballast befreit ~VaporiZed
    Dateien
    • Unterform.zip

      (92,91 kB, 52 mal heruntergeladen, zuletzt: )
    Mit freundlichen Dinges

    Lupus
    P.S: bei allen meine Fragen beziehen sich auf das arbeiten mit Visual Studio 2019 auf Win 10/64 bit und MySQL

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „VaporiZed“ ()

    Lupusverlach schrieb:

    Oder kann ich ein Panel auf TabPageSkills einfügen und das Formular dort passend einbinden?
    Ja, Panel passend platzieren und dann im Code eben:

    VB.NET-Quellcode

    1. Me.Panel1.Controls.Add(New FrmSkills With {.TopLevel = False, .Visible = True, .Dock = DockStyle.Left})

    Lupusverlach schrieb:

    Mit […] kann ich zwar das FrmSkills einbinden, aber kann ich auch vom Hauptformular aus die Eigenschafen manipulieren für das eingebundene FrmSkills?
    Ja, dazu gibt es 2 Möglichkeiten. Angenommen Du hast es im Panel1, dann

    VB.NET-Quellcode

    1. Dim SubForm = DirectCast(Panel1.Controls(0), FrmSkills)
    2. SubForm.BackColor = Drawing.Color.Red 'oder andere Sachen manipulieren
    oder "vorbereiten":

    VB.NET-Quellcode

    1. Public Class FrmHaupt
    2. Private SubForm As FrmSkills = Nothing
    3. Private Sub Frmhaupt_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    4. Me.AnsprechpartnerTableAdapter.Fill(Me.DataSet1.Ansprechpartner)
    5. Me.KundenTableAdapter.Fill(Me.DataSet1.Kunden)
    6. SubForm = New FrmSkills With {.TopLevel = False, .Visible = True, .Dock = DockStyle.Left}
    7. Me.Panel1.Controls.Add(SubForm)
    8. SubForm.BackColor = Drawing.Color.Red
    9. ' wie kann man an der Stelle die Eigenschaften von FrmSkills einstellen?
    10. End Sub
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „VaporiZed“ ()

    VaporiZed schrieb:

    Me.Panel1.Controls.Add(New FrmSkills With {.TopLevel = False, .Visible = True, .Dock = DockStyle.Left})

    Ja putzig, ich habe es halt in alter MS Access Manier versucht und deshalb gescheitert. TabPageSkills.Panel1.FrmSkills .... . Ist halt alles bissel anners hier.

    dann sieht es nun so aus und das Unterformular FrmSkills behält seine Grundeinstellung in den Eigenschaften und kann evtl. auch noch alleine verwendet werden:

    VB.NET-Quellcode

    1. Option Strict On
    2. Public Class FrmHaupt
    3. Private SubForm As FrmSkills = Nothing
    4. Private Sub Frmhaupt_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    5. Me.AnsprechpartnerTableAdapter.Fill(Me.DataSet1.Ansprechpartner)
    6. Me.KundenTableAdapter.Fill(Me.DataSet1.Kunden)
    7. SubForm = New FrmSkills With {.TopLevel = False, .Visible = True, .Dock = DockStyle.Left}
    8. Me.Panel1.Controls.Add(SubForm)
    9. SubForm.BackColor = Drawing.Color.Beige
    10. SubForm.FormBorderStyle = FormBorderStyle.None
    11. End Sub
    12. Private Sub BtnSkillForm_Click(sender As Object, e As EventArgs) Handles BtnSkillForm.Click
    13. If FrmSkills.Visible = False Then
    14. FrmSkills.Show()
    15. Else
    16. FrmSkills.Activate()
    17. End If
    18. End Sub
    19. End Class


    Für mich spricht jedoch nun mehr dafür ein Form als Unterformular zu verwenden anstelle von einem UserControl.
    Oder gibt es da noch weitere Gründe die für das eine oder eher andre sprechen von den ich noch so ganz und gar nix weiß?
    Mit freundlichen Dinges

    Lupus
    P.S: bei allen meine Fragen beziehen sich auf das arbeiten mit Visual Studio 2019 auf Win 10/64 bit und MySQL

    Lupusverlach schrieb:

    VB.NET-Quellcode

    1. FrmSkills.Show()
    Schau mal hier rein:
    Dialoge: Instanziierung von Forms und Aufruf von Dialogen
    Wenn ich Deine Hauptform im Designer öffne, bekomme ich diesen Fehler:

    Deswegen mach ich ein neues Projekt mit dem, was ich meine.
    Unterschied zwischen FormTab1 und FormTab2 in der Datei FormTab2.Designer.vb:

    VB.NET-Quellcode

    1. Inherits System.Windows.Forms.UserControl
    2. 'Inherits System.Windows.Forms.Form
    FormTab1 wird mit Code eingefügt, FormTab2 als UserControl im Designer.
    WindowsApp4.zip
    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!