Fragensteller
Wie geht das?: Transparentes Panel o.ä. über Tabcontrol, somit erzwungene Tabsteuerung über Buttons und trotzdem Sichtbarkeit der Tabüberschriften

Frage
-
Hallo zusammen,
ich nutze VB 2008 Exxpress und bin noch ziemlich unerfahren.
Ich will ein Programm zu einer statistischen Auswertung bauen, das auf die Eingabe von Daten in der richtigen Reihenfolge angewiesen ist.Um hier Fehler zu vermeiden, will ich die Folge-Tabs nach TabPage1 erst nach Erfüllung gewisser Kriterien verfügbar machen (also Freigabe des entsprechenden Button). Weiter will ich zu bestimmten TabPages Online-Hilfen anzeigen in einem Text-Feld am Rand des Programmes. UND: Ich will, dass der User immer alle Tab-Überschriften sehen kann, diese aber aus oben genannten Gründen nicht anklicken kann.
Meine Idee, worum ich um Hilfe und Lösung bitte:
Jetzt wollte ich ein Panel über die Tab-Überschriften legen und auf transparent stellen, damit man als User sehen kann, was man nicht aklicken darf. Das tolle ist jetzt, das die Transparenz eigentlich eine Röntgen-Funktion ist, denn es wird ja ausschließlich die Hintergrundfarbe bzw. das Hintergrundbild der aktuellen Form angezeigt. Was zwischen Form und transparentem Objekt ist, ist VB egal. Diese Funlktion ist ja absolut Banane oder? Wie kann ich das umschiffen bze. ändern?Was ich alternativ versucht habe und theoretisch nicht weiter verfolgen will, weil keine saubere Lösung:
TabControls auszublenden und zu inaktivieren.
Wenn die Tas wieder sihtbar gemacht werden und man mehreremale hin und her-zappt, entstehen plötzlich zwei TabPages des wiederaufgerufenen, in dem dann keine Steuerungselemente usw. mehr sind. Das ist auch nicht das, was ich will...die eine Möglichkeit war hier:
TabControl1.TabPages(3).Enabled = Falsedie andere:
Private Sub TabControl1_Enter(ByVal sender As Object, ByVal e As System.EventArgs) Handles TabControl1.Enter
'Vorerst Ausblenden aller Tabs
For i As Int32 = TabControl1.TabPages.Count - 1 To 0 Step -1
TabControl1.TabPages.Remove(TabControl1.TabPages.Item(i))
Next
TabControl1.TabPages.Add(TabPage1) 'Tab1 sichtbar
'TabControl1.TabPages.Add(TabPage2) 'Tab2 sichtbar
End Sub
Ich freue mich swehr auf Eure Vorschläge...
Und bitte antwortet nicht zu kompliziert... ;o) Ich bin noch Anfänger aber begeistert...Viele Grüße
Andreas
Alle Antworten
-
Hallo Andreas
hier nur ein paar Ideen, wo man sonst noch ansetzen könnte:
seitens TabControl, behandle das
TabControl.Deselecting-Ereignis
http://msdn.microsoft.com/de-de/library/system.windows.forms.tabcontrol.deselecting.aspx
und setzte bei "Nicht-Erfüllung gewisser Kriterien" e.Cancel = True
http://msdn.microsoft.com/de-de/library/system.windows.forms.tabcontrolcanceleventargs.aspx
oderseitens TabPage, Validation:
Control.Validating-Ereignis
http://msdn.microsoft.com/de-de/library/system.windows.forms.control.validating.aspxmit Control.CausesValidation
http://msdn.microsoft.com/de-de/library/system.windows.forms.control.causesvalidation.aspx
Plus ggf
ein Zusatz-Kriterium "freigegebene TabPage?" erst im
TabControl.Selecting-Ereignis
http://msdn.microsoft.com/de-de/library/system.windows.forms.tabcontrol.selecting.aspx
wieder mit e.Cancel markieren, wodurch das TabControl wieder auf die vorherige Page zurückschaltet. -
Hallo Thomas,
leider komme ich erst jetzt dazu, Dir zu antworten.
Ich werde Morgen Deine Vorschläge ausprobieren, sofern ich das hinbekomme.
Ich melde mich noch einmal, wenn ich das umgesetzt habe... oder am Verzweifeln bin ;o)
Ganz herzlichen Dank!!!
Viele Grüße
Andreas
-
Hi Thomas,
die Deselecting-Methode sieht sehr gut aus, sie hat nur das Problem, dass in dem Moment, wo der User dann die Bedingung des einen Tabs erfüllt hat, er in dem Moment quasi dann auf alle Tabs zugreifen kann. Ich habs bis jetzt nur so hinbekommen.
Die andere Lösung hab ich gar nicht hinbekommen, weil ich´s leider nicht kapier…Kannst Du mir evtl. einen kleinen Beispielcode schicken, wie sowas mit einem TabControl machbar wäre?
Ganz herzlichen Dank im Voraus
Andreas
-
Andreas,
ich habe zum Test mal ein frisches Formular mit einem TabControl1 inkl 6 TabPages angelegt, dann das 'Selecting' Ereignis beispielhaft wie folgt codiert, damit man nur die Pages mit Index 1+3+5
(also nur jede zweite Page, Vorsicht: Index ist 0-basiert)
anwählen kann:
Private Sub TabControl1_Selecting(ByVal sender As System.Object, ByVal e As System.Windows.Forms.TabControlCancelEventArgs) Handles TabControl1.Selecting Dim allow As Boolean = (TabControl1.SelectedIndex = 1) Or (TabControl1.SelectedIndex = 3) Or (TabControl1.SelectedIndex = 5) e.Cancel = Not allow End Sub
-
Hiho,
vielleicht zu "simpel", aber evtl. eine einfache Möglichkeit, die mir gerade einfällt:
Private Sub frmMain_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Click
TabPage2.Parent = TabControl1
End Sub
Private Sub frmMain_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
TabPage2.Parent =
Nothing
End Sub
Also einfach im Designer dein 2. Tab (oder weitere) generieren und designen, und dann beim Programmladen vom "Muttertab abkoppeln". Und sobald du sie freigeben willst, einfach wieder als "child" zuweisen (natürlich in der richtigen Reihenfolge). Allerdings werden sie dann auch nicht mehr angezeigt ...
Wenn sie angezeigt (also Tabtitel sichtbar) bleiben sollen, könnte man die Selecting/Deselecting-Events behandeln, wie Thomas das zuvor beschrieb.
LG, Dennis.