Selbstgehäkeltes mdi-modul - passt das so?

  • VB.NET

Es gibt 44 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    hi,

    das kannste dir in dem logistiktool-projekt von mir anschauen.. unter HelpersSmallEd/WinFormHelpers/TabbedMdi.vb
    da ist dann alles für die Mdi-Steuerung enthalten (ich hatte das ja alles ausgelagert, damit man das direkt in mehrere Projekte als "Helper" einbinden kann:

    Spoiler anzeigen

    Visual Basic-Quellcode

    1. Imports System.Collections
    2. Imports System.Runtime.CompilerServices
    3. Public Module TabbedMdi
    4. Private _tabControl As TabControl
    5. Private _mdiParent As Form
    6. Private _tv As TreeView
    7. ''' <summary> Anzeigen einer ChildForm - Optional mit ControlStyling und Registrierung des DataSets, sowie verstecken des TreeView </summary>
    8. <Extension>
    9. Public Sub ShowMdiChild(mdiParent As Form, Child As Form, mdiTab As TabControl, Optional dts As DataSet = Nothing, Optional CtrlStyling As Boolean = False, Optional tv As TreeView = Nothing)
    10. _tabControl = mdiTab
    11. _mdiParent = mdiParent
    12. _tv = tv
    13. RegisterMdiHandle() ' Registrierung der Handle-Methoden
    14. With Child
    15. If .MdiParent Is mdiParent Then
    16. .Select()
    17. Else
    18. tv.TVHide
    19. If Not dts Is Nothing Then dts.Register(.Self, True) ' Optional nur mit den Helpers von ErfinderDesRades
    20. If CtrlStyling = True Then ControlStyling.StyleDGV(.Self) ' Optional: eine Erweiterung von ErfinderDesRades
    21. .WindowState = FormWindowState.Maximized ' Je nach Anwendungsfall entweder alle Childs maximiert öffnen, oder nur das 1.
    22. 'If _mdiParent.MdiChildren.Count = 0 Then .WindowState = FormWindowState.Maximized
    23. .MdiParent = _mdiParent
    24. .MinimizeBox = False ' Optional: Minimize-Boxen auf Child-Forms sind unnötig
    25. .Show()
    26. 'idiotischerweise muss der ChildForm-Menustrip, dessen Items einerseits automatisch in den Parent-Menustrip
    27. ' eingemerged werden, andererseits explizit versteckt werden - sonst verbleibt ein leerer Menustrip auffm ChildForm
    28. Child.Controls.OfType(Of MenuStrip)().SingleOrDefault()?.Hide()
    29. mdiParent.ResumeLayout()
    30. End If
    31. End With
    32. End Sub
    33. ''' <summary> Registriert die Handle-Methoden für die Steuerung der Child-Forms </summary>
    34. Private Sub RegisterMdiHandle()
    35. AddHandler _mdiParent.MdiChildActivate, AddressOf MdiChildOpen
    36. AddHandler _tabControl.SelectedIndexChanged, AddressOf Tab_SelectedIndexChanged
    37. End Sub
    38. ''' <summary> Stellt beim Schließen des Childs sicher, dass die entsprechende TabPage entfernt wird </summary>
    39. Private Sub MdiChildClose(sender As Object, e As FormClosedEventArgs)
    40. DirectCast(DirectCast(sender, Form).Tag, TabPage).Dispose()
    41. If _mdiParent.MdiChildren.Count <= 1 Then
    42. For Each tsi In _mdiParent.Controls.OfType(Of ToolStripMenuItem)()
    43. If Not tsi.Enabled Then tsi.Enabled = True
    44. Next
    45. _tv.TVshow 'wenn das letzte Child geschlossen wird, TreeView einblenden
    46. End If
    47. End Sub
    48. ''' <summary> Prüft, ob das Child bereits existiert, falls nicht wird eine neue TabPage erstellt </summary>
    49. Private Sub MdiChildOpen(sender As Object, e As EventArgs)
    50. If _mdiParent.ActiveMdiChild Is Nothing Then
    51. _tabControl.Visible = False
    52. Else
    53. Dim tp = DirectCast(_mdiParent.ActiveMdiChild.Tag, TabPage)
    54. If tp Is Nothing Then
    55. tp = New TabPage(_mdiParent.ActiveMdiChild.Text)
    56. tp.Tag = _mdiParent.ActiveMdiChild
    57. _mdiParent.ActiveMdiChild.Tag = tp
    58. _tabControl.TabPages.Add(tp)
    59. AddHandler _mdiParent.ActiveMdiChild.FormClosed, AddressOf MdiChildClose
    60. If Not _tabControl.Visible Then _tabControl.Visible = True
    61. End If
    62. _tabControl.SelectedTab = tp
    63. End If
    64. End Sub
    65. ''' <summary> Ruft beim wechseln der TabPage das entsprechende Child auf und zeigt es an</summary>
    66. Private Sub Tab_SelectedIndexChanged(sender As Object, e As EventArgs)
    67. DirectCast(_tabControl.SelectedTab?.Tag, Form)?.Select()
    68. End Sub
    69. End Module


    In Zeile 41-50 das Close, der Aufruf geht in etwa so (aus frmMain): ShowMdiChild(frmStandort, tabMdi, Dts, True, tvMain)
    Deshalb, mir ist es relativ Wurscht ob ich das Aktivieren des TSI noch mit in's Modul packe oder über ein Event auf der frmMain, jedoch kenn ich kein
    Event was das auslösen könnte wenn Childs.Count <1

    Für das Auslösen im Modul muss ich dann rekursiv meine MenuStrips nach TSI druchwühlen?

    Edit:
    hierüber bekomm ich eine "StackOverflow Exception"

    VB.NET-Quellcode

    1. Private Sub WalkThroughMS(mStrip As MenuStrip)
    2. Dim recurse As Action(Of ToolStripItemCollection) = Sub(tsic As ToolStripItemCollection)
    3. For Each tsi As ToolStripMenuItem In tsic
    4. If Not tsi.Enabled Then tsi.Enabled = True
    5. recurse(tsic) ' Selbst-Aufruf der anonymen Methode
    6. Next
    7. End Sub
    8. recurse(mStrip.Items)
    9. End Sub

    Originaler (noch) Nichtskönner :D

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

    Na, ein bischen mehr als garkeine Ahnung hast du davon sicherlich.
    Ich glaube, kein einziger der in post #43 verwendeten Begriffe ist dir unbekannt: MDIParent, WithEvents, Event, Klasse, Objekt.
    Übrigens "Umbauen" nicht wörtlich verstehen - dabei entstünden ja nicht lauffähige Zustände.
    Also eine Klasse bauen mit derselben Funktionalität wie derzeit das Modul, und wenn fertig und funzt, das Modul löschen.