Hallo,
ich bin gerade am experimentieren. Ob's nun so ast rein ist, weis ich ned und nen feinschliff bekommt auch erst später.
Versuche einer Forderung all unserer Außendienstmitarbeiter nachzukommen. Daher die Idee nach MDI ähnlicher Umsetzung.
Aufbau:
1. Normales Form mit Menüs und einem TreeView (stehen alle Anwendungen drinnen)
2. TabControl (eigenes, wg. Farbe ... naja, ob auch dies so ne gute Idee war, aber das hässliche grau passte 0,0 zum Programm )
3. Es werden die Anwendungen wie z. B. Kundenstamm, Berichtswesen, Auftragswesen usw. bei Klick im Treeview im missbrauchen TabControl angezeigt.
4. Das Problem: Wie kann ich nun das ChildForm schließen und dabei auch gleich den Reiter entfernen? ...Reiter klar mit Tabblabl.remove ... aber worüber ich mir den Kopf zerbreche ist, wie macht ich das voneinander abhängig?
Mein Code:
Erstmal das eigene TabControl als Klasse:
Dann der Code für das öffnen des Programms:
Das funktioniert soweit auch gut, kein Fehlermeldungen nix! Läuft auch länger stabil auch bei vielen offenen Anwendungen und Reitern.
Nun aber ... ich weis nicht wie ich es von einander abhängig machen kann, dass wenn Form geschlossen wird auch der Reiter verschwindet oder evtl. noch besser... ein X in den Reiter rein, der das ChildForm schließt und den Reiter wegmacht.
Außerdem habe ich festgestellt, vielleicht hat dazu einer nen Tipp... bei meinem "eigenen" TabControl werden keine Images angezeigt, wenn ich dies hinterlegt.
Wäre nett wenn einer was zu meinem "Missbrauch" vom TabControl was sagt Irgendwie abartig, aber es funktioniert und Erfindergeist hat was
Vielen Dank vorab! Gruß Michl
ich bin gerade am experimentieren. Ob's nun so ast rein ist, weis ich ned und nen feinschliff bekommt auch erst später.
Versuche einer Forderung all unserer Außendienstmitarbeiter nachzukommen. Daher die Idee nach MDI ähnlicher Umsetzung.
Aufbau:
1. Normales Form mit Menüs und einem TreeView (stehen alle Anwendungen drinnen)
2. TabControl (eigenes, wg. Farbe ... naja, ob auch dies so ne gute Idee war, aber das hässliche grau passte 0,0 zum Programm )
3. Es werden die Anwendungen wie z. B. Kundenstamm, Berichtswesen, Auftragswesen usw. bei Klick im Treeview im missbrauchen TabControl angezeigt.
4. Das Problem: Wie kann ich nun das ChildForm schließen und dabei auch gleich den Reiter entfernen? ...Reiter klar mit Tabblabl.remove ... aber worüber ich mir den Kopf zerbreche ist, wie macht ich das voneinander abhängig?
Mein Code:
Erstmal das eigene TabControl als Klasse:
VB.NET-Quellcode
- Public Class CLM_TabControl1
- Inherits TabControl
- Public Class RiderClickedEventArgs
- Inherits EventArgs
- Public ReadOnly TabPage As TabPage
- Public ReadOnly Index As Integer
- Public Sub New(ByVal Index As Integer, ByVal TabPage As TabPage)
- Me.Index = Index
- Me.TabPage = TabPage
- End Sub
- End Class
- Public Event RiderClicked As EventHandler(Of RiderClickedEventArgs)
- Private _Brush As New SolidBrush(Color.FromArgb(199, 227, 255))
- Private ReadOnly _Disableds As New List(Of Control)
- Public Sub New()
- Me.DrawMode = TabDrawMode.OwnerDrawFixed
- End Sub
- Protected Overrides Sub OnClick(ByVal e As EventArgs)
- Dim Indx As Integer = GetTabRider(Me.PointToClient(Control.MousePosition))
- If Indx < 0 OrElse Not IsTabEnabled(Indx) Then Return
- RaiseEvent RiderClicked(Me, New RiderClickedEventArgs(Indx, TabPages(Indx)))
- End Sub
- Protected Overrides Sub Dispose(ByVal disposing As Boolean)
- If disposing Then
- _Brush.Dispose()
- End If
- MyBase.Dispose(disposing)
- End Sub
- Protected Overrides Sub OnDrawItem(ByVal e As System.Windows.Forms.DrawItemEventArgs)
- MyBase.OnDrawItem(e)
- Const tff As TextFormatFlags = TextFormatFlags.HorizontalCenter Or TextFormatFlags.VerticalCenter
- Dim tp As TabPage = MyBase.TabPages(e.Index)
- Dim rct As Rectangle = e.Bounds
- Dim g As Graphics = e.Graphics
- If _Disableds.Contains(tp) Then
- _Brush.Color = Color.FromArgb(199, 227, 255) 'SystemColors.Control
- g.FillRectangle(_Brush, rct)
- ControlPaint.DrawStringDisabled(g, tp.Text, Me.Font, Color.FromArgb(199, 227, 255), rct, tff)
- Else
- _Brush.Color = Color.FromArgb(199, 227, 255) ' tp.BackColor
- g.FillRectangle(_Brush, rct)
- TextRenderer.DrawText(g, tp.Text, Me.Font, rct, tp.ForeColor, tff)
- End If
- End Sub
- Private Function GetTabRider(ByVal Pt As Point) As Integer
- For I As Integer = 0 To Me.TabPages.Count - 1
- If Me.GetTabRect(I).Contains(Pt) Then Return I
- Next
- Return -1
- End Function
- Public Property IsTabEnabled(ByVal Index As Integer) As Boolean
- Get
- Return Not _Disableds.Contains(MyBase.TabPages(Index))
- End Get
- Set(ByVal Value As Boolean)
- IsTabEnabled(MyBase.TabPages(Index)) = Value
- End Set
- End Property
- Public Property IsTabEnabled(ByVal Tp As TabPage) As Boolean
- Get
- Return Not _Disableds.Contains(Tp)
- End Get
- Set(ByVal Value As Boolean)
- If _Disableds.Contains(Tp) <> Value Then Return
- Tp.Enabled = Value
- If Value Then
- _Disableds.Remove(Tp)
- Else
- _Disableds.Add(Tp)
- End If
- Me.Invalidate(New Rectangle(0, 0, Me.Width, Me.GetTabRect(0).Height))
- End Set
- End Property
- End Class
Dann der Code für das öffnen des Programms:
VB.NET-Quellcode
- Private Sub OpenFormAsString(ByVal formname As String)
- Dim f As New Form
- For Each t As Type In Me.GetType().Assembly.GetTypes()
- If t.Name.Equals(formname) Then
- f = System.Activator.CreateInstance(t)
- f.TopLevel = False
- f.Visible = True
- ' Neuen Reiter vorbereiten und einfügen
- Dim myTabPage As New TabPage(t.ToString)
- ClM_TabControl11.TabPages.Add(myTabPage)
- Dim tabPage As New TabPage
- ' Neuen Reiter suchen, Controlseinfügen und selektieren
- For Each tabPage In ClM_TabControl11.TabPages
- If tabPage.Text = t.ToString Then
- tabPage.Controls.Add(f)
- tabPage.Select()
- End If
- Next
- ClM_TabControl11.SelectedTab = tabPage
- ClM_TabControl11.Controls.Add(f)
- f.BringToFront()
- End If
- Next
- End Sub
Das funktioniert soweit auch gut, kein Fehlermeldungen nix! Läuft auch länger stabil auch bei vielen offenen Anwendungen und Reitern.
Nun aber ... ich weis nicht wie ich es von einander abhängig machen kann, dass wenn Form geschlossen wird auch der Reiter verschwindet oder evtl. noch besser... ein X in den Reiter rein, der das ChildForm schließt und den Reiter wegmacht.
Außerdem habe ich festgestellt, vielleicht hat dazu einer nen Tipp... bei meinem "eigenen" TabControl werden keine Images angezeigt, wenn ich dies hinterlegt.
Wäre nett wenn einer was zu meinem "Missbrauch" vom TabControl was sagt Irgendwie abartig, aber es funktioniert und Erfindergeist hat was
Vielen Dank vorab! Gruß Michl
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „michl75“ ()