Selbstgehäkeltes mdi-modul - passt das so?
- VB.NET
Sie verwenden einen veralteten Browser (%browser%) mit Sicherheitsschwachstellen und können nicht alle Funktionen dieser Webseite nutzen.
Hier erfahren Sie, wie einfach Sie Ihren Browser aktualisieren können.
Hier erfahren Sie, wie einfach Sie Ihren Browser aktualisieren können.
Es gibt 49 Antworten in diesem Thema. Der letzte Beitrag () ist von tragl.
-
-
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 VB.NET-Quellcode
- Imports System.Collections
- Imports System.Runtime.CompilerServices
- Public Module TabbedMdi
- Private _tabControl As TabControl
- Private _mdiParent As Form
- Private _tv As TreeView
- ''' <summary> Anzeigen einer ChildForm - Optional mit ControlStyling und Registrierung des DataSets, sowie verstecken des TreeView </summary>
- <Extension>
- 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)
- _tabControl = mdiTab
- _mdiParent = mdiParent
- _tv = tv
- RegisterMdiHandle() ' Registrierung der Handle-Methoden
- With Child
- If .MdiParent Is mdiParent Then
- .Select()
- Else
- tv.TVHide
- If Not dts Is Nothing Then dts.Register(.Self, True) ' Optional nur mit den Helpers von ErfinderDesRades
- If CtrlStyling = True Then ControlStyling.StyleDGV(.Self) ' Optional: eine Erweiterung von ErfinderDesRades
- .WindowState = FormWindowState.Maximized ' Je nach Anwendungsfall entweder alle Childs maximiert öffnen, oder nur das 1.
- 'If _mdiParent.MdiChildren.Count = 0 Then .WindowState = FormWindowState.Maximized
- .MdiParent = _mdiParent
- .MinimizeBox = False ' Optional: Minimize-Boxen auf Child-Forms sind unnötig
- .Show()
- 'idiotischerweise muss der ChildForm-Menustrip, dessen Items einerseits automatisch in den Parent-Menustrip
- ' eingemerged werden, andererseits explizit versteckt werden - sonst verbleibt ein leerer Menustrip auffm ChildForm
- Child.Controls.OfType(Of MenuStrip)().SingleOrDefault()?.Hide()
- mdiParent.ResumeLayout()
- End If
- End With
- End Sub
- ''' <summary> Registriert die Handle-Methoden für die Steuerung der Child-Forms </summary>
- Private Sub RegisterMdiHandle()
- AddHandler _mdiParent.MdiChildActivate, AddressOf MdiChildOpen
- AddHandler _tabControl.SelectedIndexChanged, AddressOf Tab_SelectedIndexChanged
- End Sub
- ''' <summary> Stellt beim Schließen des Childs sicher, dass die entsprechende TabPage entfernt wird </summary>
- Private Sub MdiChildClose(sender As Object, e As FormClosedEventArgs)
- DirectCast(DirectCast(sender, Form).Tag, TabPage).Dispose()
- If _mdiParent.MdiChildren.Count <= 1 Then
- For Each tsi In _mdiParent.Controls.OfType(Of ToolStripMenuItem)()
- If Not tsi.Enabled Then tsi.Enabled = True
- Next
- _tv.TVshow 'wenn das letzte Child geschlossen wird, TreeView einblenden
- End If
- End Sub
- ''' <summary> Prüft, ob das Child bereits existiert, falls nicht wird eine neue TabPage erstellt </summary>
- Private Sub MdiChildOpen(sender As Object, e As EventArgs)
- If _mdiParent.ActiveMdiChild Is Nothing Then
- _tabControl.Visible = False
- Else
- Dim tp = DirectCast(_mdiParent.ActiveMdiChild.Tag, TabPage)
- If tp Is Nothing Then
- tp = New TabPage(_mdiParent.ActiveMdiChild.Text)
- tp.Tag = _mdiParent.ActiveMdiChild
- _mdiParent.ActiveMdiChild.Tag = tp
- _tabControl.TabPages.Add(tp)
- AddHandler _mdiParent.ActiveMdiChild.FormClosed, AddressOf MdiChildClose
- If Not _tabControl.Visible Then _tabControl.Visible = True
- End If
- _tabControl.SelectedTab = tp
- End If
- End Sub
- ''' <summary> Ruft beim wechseln der TabPage das entsprechende Child auf und zeigt es an</summary>
- Private Sub Tab_SelectedIndexChanged(sender As Object, e As EventArgs)
- DirectCast(_tabControl.SelectedTab?.Tag, Form)?.Select()
- End Sub
- 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
- Private Sub WalkThroughMS(mStrip As MenuStrip)
- Dim recurse As Action(Of ToolStripItemCollection) = Sub(tsic As ToolStripItemCollection)
- For Each tsi As ToolStripMenuItem In tsic
- If Not tsi.Enabled Then tsi.Enabled = True
- recurse(tsic) ' Selbst-Aufruf der anonymen Methode
- Next
- End Sub
- recurse(mStrip.Items)
- End Sub
CodeTags korrigiert ~VaporiZed
"Na, wie ist das Wetter bei dir?"
"Caps Lock."
"Hä?"
"Shift ohne Ende!"Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „VaporiZed“ ()
-
-
-
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. -
Hi, ich hab nochmal eine Frage zu der Geschichte. Ich habe 2 oder mehr Childs geöffnet
Bsp.:Mitarbeiter
undPlaner
Mitarbeiter
ist das aktive Child, was mir angezeigt wird. Dort rufe ich einen Dialog auf, sobald ein Dialog geöffnet wird, switcht er mir die Ansicht auf das ChildPlaner
.
Das soll ja so nicht sein, denn der Dialog gehört zuMitarbeiter
und da wollte ich auch gerne weiter arbeiten. Muss also immer wieder umschalten. Kann man das verhindern? Wüsste
grad nicht wie..."Na, wie ist das Wetter bei dir?"
"Caps Lock."
"Hä?"
"Shift ohne Ende!" -
(tl;dr)
Ich kann das nicht nachvollziehen.
Und im ChildForm gibt's n Button, der einen Dialog öffnet. Wenn der Dialog erscheint, ändert sich das aktive ChildForm nicht. Was macht Dein Dialog-Zeige-Code noch?
##########
Wird da Dein selbstverdrahtetes_tabControl.SelectedIndexChanged
-Event gefeuert und ändert da was an der Selektion?
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. -
VaporiZed schrieb:
und ändert da was an der Selektion?
Habs grad mal durch den Debugger laufen lassen. Sobald ich einen Dialog öffne, wirdMdiChildOpen
gefeuert und dort ist auf einmal das zuletzt geöffnete Child alsActiveMdiChild
drinnen.
Öffne ich erstPlaner
und dannMitarbeiter
kann ich im Mitarbeiter-Child Dialoge öffnen, ohne das er umspringt. Bei umgekehrter Reihenfolge springt er um.
Hab's schon mitDirectCast(tabMdi.SelectedTab?.Tag, Form)?.Activate()
imTab_SelectedIndexChanged
versucht, jedoch ohne Erfolg
Also bei der Öffnen-Reihenfolge (Mitarbeiter, Planer) dann Mitarbeiter selektieren und dort einen Dialog öffnen, verhält sichActiveMdiChild
wie folgt:
-Mitarbeiter (richtig)
-Planer (richtig)
-Mitarbeiter (richtig)
-Planer (falsch, denn hier muss Mitarbeiter stehen bleiben)
"Na, wie ist das Wetter bei dir?"
"Caps Lock."
"Hä?"
"Shift ohne Ende!" -
Da ich jetzt tatsächlich so faul bin und Dein Projekt nicht nachbauen werde: Funktioniert es denn richtig, wenn Du den
MdiChildOpen
-EventHandler vor Dialoganzeige abkoppelst und danach wieder anbindest?
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. -
VaporiZed schrieb:
abkoppelst und danach wieder anbindest?
vermutlich ja, wäre aber recht kompliziert das zu testen. Denn der komplette MDI-Code sitzt auf frmMain und den könnte ich ja höchsten sehr dirty aufrufen von frmMitarbeiter aus.
(die Subs müssten Public und dann sowas wieRemoveHandler frmMain.MdiChildActivate, AddressOf frmMain.MdiChildOpen
oder so, gefällt mir nicht mal zum Testen
Zudem wäre es unmengen an Arbeit wenn das funzen würde, denn ich hab etliche Forms mit Dialogen"Na, wie ist das Wetter bei dir?"
"Caps Lock."
"Hä?"
"Shift ohne Ende!"
-
Ähnliche Themen
-
Visual Basic: Aus Form ein Modul starten
Gelöschter Benutzer - - Sonstige Problemstellungen -
Dexxter - - Sonstige Problemstellungen
-
Chris213 - - Sonstige Problemstellungen
-
4 Benutzer haben hier geschrieben
- tragl (27)
- RodFromGermany (13)
- ErfinderDesRades (8)
- VaporiZed (2)