Du bist nicht angemeldet.

ErfinderDesRades

Wer nicht fragt bleibt dumm

  • »ErfinderDesRades« ist der Autor dieses Themas

Beiträge: 5 786

Dabei seit: 18. Februar 2011

Hilfreich-Bewertungen: 669

  • Private Nachricht senden

1

Mittwoch, 5. Oktober 2011, 18:30

TabControl ohne Reiter

Hier wie man die Reiter eines TabControls verstecken kann, weil manche finden die häßlich.
Damit kann man Funktionsbereiche einer Anwendung auf verschiedene Tabs unterbringen, und etwa über ein menü oder über eine Combo-/List-Box steuern, welcher Funktionsbereich grade aktiv sein soll.

Ich hab gleich alle 3 genannten Steuerungs-möglichkeiten implementiert, wie man sieht, macht die Steuerung per Menü etwas mehr Aufwand, da man kein Databinding anwenden kann.

Visual Basic Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
Public Class frmOhneReiter

   Private Sub frmOhneReiter_Load(ByVal sender As Object, ByVal e As EventArgs) _
         Handles Me.Load
      tabControl1.SuspendLayout()
      'um Reiter zu verbergen benötigt man die 3 folgenden Einstellungen
      'ich empfehle das codeseitig zu machen, weil im Designer hat man sonst
      '   Probleme, die TabPages zum designen auszuwählen
      tabControl1.SizeMode = TabSizeMode.Fixed
      tabControl1.ItemSize = New Size(0, 1)
      tabControl1.Appearance = TabAppearance.Buttons
      tabControl1.ResumeLayout()
      'list-/Combo-Box konfigurieren
      Dim pages = tabControl1.TabPages
      Me.listBox1.DisplayMember = "Text"
      Me.ComboBox1.DisplayMember = "Text"
      listBox1.DataSource = pages
      ComboBox1.DataSource = pages
      'MenuItems erzeugen und konfigurieren
      Dim tabMenuItems = TabPageToolStripMenuItem.DropDownItems
      For Each tp As TabPage In pages
         Dim itm = DirectCast(tabMenuItems.Add(tp.Text), ToolStripMenuItem)
         AddHandler itm.Click, AddressOf MenuItem_Click
      Next
      DirectCast(tabMenuItems(0), ToolStripMenuItem).Checked = True
   End Sub

   Private Sub listControl_SelectedIndexChanged(ByVal sender As Object, ByVal e As EventArgs) _
         Handles listBox1.SelectedIndexChanged, ComboBox1.SelectedIndexChanged
      tabControl1.SelectedIndex = listBox1.SelectedIndex
      'TabControl ist bisserl doof - es nimmt den Focus, auch wenn nur per Code selektiert wurde
      listBox1.Focus()             'Focus zurück zur Listbox
   End Sub

   Private Sub MenuItem_Click(ByVal sender As Object, ByVal e As EventArgs)
      Dim tabMenuItems = TabPageToolStripMenuItem.DropDownItems
      For i = 0 To tabMenuItems.Count - 1
         Dim itm = DirectCast(tabMenuItems(i), ToolStripMenuItem)
         Dim isSelected = itm Is sender
         itm.Checked = isSelected
         If isSelected Then tabControl1.SelectedIndex = i
      Next
   End Sub

End Class


Erläuterung
Für List- und Combo-Box wird im Load jeweils DataSource und DisplayMember festgelegt, und im listControl_SelectedIndexChanged wird ihr SelectedIndex aufs TabControl übertragen.
Die MenüItem müssen erst codeseitig erzeugt, und per AddHandler ans MenuItem_Click angeschlossen werden.
In MenuItem_Click muß der Index für den gewünschten TabIndex erst ermittelt werden, und auch die Checked-Property aller Items korrekt gesetz wern - naja - auch kein Act.

Man muß sich halt für eine Steuerung entscheiden, weil so, wies hier gemacht ist, erfolgt keine Synchronisation der Listbox, wenn per Menü die Tab gewechselt wurde. Und umgekehrt auch nicht.

Weitere Ideen, ein TabControl zu pimpen, finden sich auf erweitertes TabControl
»ErfinderDesRades« hat folgende Datei angehängt:
  • OhneReiter00.zip (14,32 kB - 43 mal heruntergeladen - zuletzt: Gestern, 20:24)

ErfinderDesRades

Wer nicht fragt bleibt dumm

  • »ErfinderDesRades« ist der Autor dieses Themas

Beiträge: 5 786

Dabei seit: 18. Februar 2011

Hilfreich-Bewertungen: 669

  • Private Nachricht senden

2

Mittwoch, 25. Januar 2012, 21:52

TabControl ohne Reiter

[OffTopic]
Jetzt hatte ich doch glatt den Überblick verloren, und meinen eigenen Tipp nicht wiedergefunden, und daher neu gemacht.
Ich hab aber nicht einfach einen löschen lassen, sondern hier zusammenführen (Dank an die Mods! :)).
Weil die neue Variante zeigt auch die Ansteuerung der Tabs mittels "Next"/"Previous" - Buttons, welche auf den Tabs aufsitzen (Assistenten-Navigation).

Also hier eiglich dasselbe wie oben, nochmal:
[/OffTopic]



Mittm TabControl kann man die Funktionalität einer komplexen Anwendung in sinnvolle übersichtliche Einheiten strukturieren, ohne dass man viele Dialoge aufpoppen lassen müsste.

Gelegentlich will man sich aber auch sowas wie einen Assistenten basteln, also eine Anwendung, die eine Ansicht nach der anneren nacheinander präsentiert, und wo man vor- und zurück-navigieren kann - Assistenten-Navigation.

Oder man hat eine Treeview oder Listbox, und je nach angewähltem Item benötigt man eine annere Ansicht - Frameset-Navigation.

Auch für diese Anforderungen eignet sich TabControl. Man muß nur die Reiter verstecken, dann hat man damit ein Dingsbums mit vielen Panels, die man nach Belieben nach vorne holen kann (.SelectedIndex setzen oder .SelectedTab)
Dabei erhält man sogar den Komfort, dass die Reiter nur zur Laufzeit verschwinden - zum Designen kann man ganz normal zwischen den Tabs wechseln, und seine Controls aufbringen.

Anbei ein Sample, was die genannten 3 Möglichkeiten der Navigation aufzeigt:
  1. standard-Navigation mittels der Reiter
  2. versteckte Reiter - Assistenten-Navigation durch Vor- und Zurück-Buttons
  3. versteckte Reiter - Frameset-Navigation über Anwahl von Listbox-Items

Visual Basic Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
Public Class frmOhneReiter

   Private Sub frmOhneReiter_Load(ByVal sender As Object, ByVal e As EventArgs) _
         Handles MyBase.Load
      lstFramesetNavi.DataSource = TabControl2.TabPages.Cast(Of TabPage)().ToList
      lstFramesetNavi.DisplayMember = "Text"
      For Each tc In {TabControl2, TabControl3}
         With tc
            .SuspendLayout()
            'diese 3 Einstellungen verstecken die Reiter erst zur Laufzeit
            'bei Design-Arbeiten am Form sind die Reiter ja sehr nützlich 
            .SizeMode = TabSizeMode.Fixed
            .ItemSize = New Size(0, 1)
            .Appearance = TabAppearance.Buttons
            .ResumeLayout()
         End With
      Next
   End Sub

   Private Sub WizzardNaviButton_Click(ByVal sender As Object, ByVal e As EventArgs) _
         Handles btNext6.Click, btPrev7.Click, btNext7.Click, btPrev8.Click
      Select Case True
         Case sender Is btNext6, sender Is btNext7
            TabControl3.SelectedIndex += 1
         Case sender Is btPrev7, sender Is btPrev8
            TabControl3.SelectedIndex -= 1
      End Select
   End Sub

   Private Sub lstFramesetNavi_SelectedIndexChanged(ByVal sender As Object, ByVal e As EventArgs) _
         Handles lstFramesetNavi.SelectedIndexChanged
      TabControl2.SelectedIndex = lstFramesetNavi.SelectedIndex
   End Sub

End Class
»ErfinderDesRades« hat folgende Datei angehängt:
  • OhneReiter00.zip (191,9 kB - 23 mal heruntergeladen - zuletzt: Gestern, 20:24)

Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von »ErfinderDesRades« (13. Februar 2012, 14:40)


Nikx

Flummiball

  • »Nikx« ist männlich

Beiträge: 296

Dabei seit: 4. Oktober 2010

Wohnort: Zuhause

Frühere Benutzernamen: Ninoxo

Hilfreich-Bewertungen: 24

  • Private Nachricht senden

3

Mittwoch, 25. Januar 2012, 22:17

Screenshot wäre super :)
-- We are Anonymous. We are Legion. We do not Forgive. We do not Forget. Expect Us. --

ErfinderDesRades

Wer nicht fragt bleibt dumm

  • »ErfinderDesRades« ist der Autor dieses Themas

Beiträge: 5 786

Dabei seit: 18. Februar 2011

Hilfreich-Bewertungen: 669

  • Private Nachricht senden

4

Donnerstag, 26. Januar 2012, 00:02

Och - optisch gibt das nix her. Weil die Seiten muß eh jeder selber gestalten.
Das Wesentliche an Navigation ist ja, dass man sich durch die Seiten so durch-schaltet - und wie soll man diese Funktionalität in einem Screenshot einfangen?



Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »ErfinderDesRades« (26. Januar 2012, 17:12)


Nikx

Flummiball

  • »Nikx« ist männlich

Beiträge: 296

Dabei seit: 4. Oktober 2010

Wohnort: Zuhause

Frühere Benutzernamen: Ninoxo

Hilfreich-Bewertungen: 24

  • Private Nachricht senden

5

Donnerstag, 26. Januar 2012, 07:20

Nun gut, ich sehs ein ;)
Falls ichs hinbekomme versuche ich mal das irgendwie darzustellen ^^
-- We are Anonymous. We are Legion. We do not Forgive. We do not Forget. Expect Us. --

Ähnliche Themen

Verwendete Tags

Assistent, Navigation, Tabcontrol, tabpage

Social Bookmarks