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

  • 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 = False

    die 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

    Sonntag, 28. November 2010 10:34

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


     oder

    seitens TabPage, Validation:
    Control.Validating-Ereignis
    http://msdn.microsoft.com/de-de/library/system.windows.forms.control.validating.aspx

    mit 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.

    Sonntag, 28. November 2010 19:29
  • 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

    Montag, 29. November 2010 20:28
  • 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

    Donnerstag, 2. Dezember 2010 20:44
  • 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
    
    
    Donnerstag, 2. Dezember 2010 21:44
  • 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.

    Montag, 6. Dezember 2010 08:16