Autor
|
Thema: vb.net: tabpage deaktivieren, verstecken, disablen... (4224 mal gelesen)
|
KMassler Ehrenmitglied V.I.P. h.c. CAD Admin + Mädchen für Alles...
Beiträge: 2657 Registriert: 06.11.2000
|
erstellt am: 14. Sep. 2015 11:10 <-- editieren / zitieren --> Unities abgeben:
Hallo Experten, ich habe da mal wieder ein Problem: Ich habe ein Programm mit einem TabControl (System.Windows.Forms.Tabcontrol) mit mehreren Reitern, also TabPages. Nun möchte ich in einem bestimmten Fall nur noch eine dieser TabPages verfügbar machen, die anderen müssen disabled, versteckt, gesperrt, was auch immer sein, also vom User einfach nicht anwählbar. Meine googeleien führen immer entweder zu enable=false, dispose oder zu remove. Ich habs probiert mit einer for...each-schleife: Code: For Each tp As TabPage In TabGeneral.TabPages Select Case tp.Name Case "tpModifications" 'do nothing Case Else 'deaktivieren tp.Hide() End Select Next
Das Problem: Außer "dispose" und "hide" steht mir keine passende Methode zur Verfügung! Dispose geht nicht, da die Tabpages viele controls enthalten, die während der Laufzeit angesprochen werden, auch wenn die Tabs nicht ausgewählt sind. Hide kann ich verwenden, funktioniert aber nur temporär: Beim Start wird der Inhalt der tabpage ausgeblendet, wenn ich die aber noch einmal aktiviere, ist alles wieder sichtbar. Die Remove-Methode oder Enabled-Eigenschaft werden mir gar nicht angezeigt, die kann ich nicht verwenden. Was mach ich falsch, wieso kann ich das blöde Ding nicht disablen? Alternative: Wenn das nicht funktioniert, bleibt mir nur die Alternativlösung, bei jedem Tab im "enter"-Event zu prüfen, ob er angezeigt werden darf. Und wenn nicht, wieder einen erlaubten Tab zu aktivieren. Das geht, habe ich anderswo auch schon verwendet, ist aber natürlich viel aufwändiger. ------------------ Klaus www.al-ko.com | mein Gästebuch Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
KlaK Ehrenmitglied V.I.P. h.c. Dipl. Ing. Vermessung, CAD- und Netz-Admin
Beiträge: 2624 Registriert: 02.05.2006 AutoCAD LandDesktop R2 bis 2004 Civil 3D 2005 - 2014 Plateia, Canalis Visual Basic
|
erstellt am: 14. Sep. 2015 12:00 <-- editieren / zitieren --> Unities abgeben: Nur für KMassler
Hallo Namensvetter, Warum verwendest Du keine Multipages? Die kannst Du nach belieben ein- und ausblenden und vom Aussehen her ist das kein Unterschied. Ausblenden über: UserForm1.MultiPage1.Pages.Item("Page2").Visible = True Grüße Klaus Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
KMassler Ehrenmitglied V.I.P. h.c. CAD Admin + Mädchen für Alles...
Beiträge: 2657 Registriert: 06.11.2000
|
erstellt am: 14. Sep. 2015 13:53 <-- editieren / zitieren --> Unities abgeben:
Hmm...Danke für den Tipp, aber... Multipage gibts nicht in vb.net (Visual Studio Premium 2013). Auch nicht in VSTA (zumindest nicht bei mir). In beiden Fällen gibt's 'nur' TabControl mit TabPages. Das sollte wohl die verbesserte Variante der Multipages sein (Ha ha)! Multipage scheint es nur in VBA zu geben. Das hilft mir aber jetzt nicht. ------------------ Klaus www.al-ko.com | mein Gästebuch Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
KlaK Ehrenmitglied V.I.P. h.c. Dipl. Ing. Vermessung, CAD- und Netz-Admin
Beiträge: 2624 Registriert: 02.05.2006 AutoCAD LandDesktop R2 bis 2004 Civil 3D 2005 - 2014 Plateia, Canalis Visual Basic
|
erstellt am: 14. Sep. 2015 14:13 <-- editieren / zitieren --> Unities abgeben: Nur für KMassler
|
HenryV Mitglied Konstrukteur, Engineering
Beiträge: 778 Registriert: 18.05.2005 SolidWorks 2020 x64 SP3.0 Dell Precision 5820 Intel Xeon W-2125 4x4GHz NVIDIA Quadro P2000 5GB 32GB RAM 2x Dell U2412M, 24" TFT Windows 10 Enterprise x64 21H1 Microsoft Office 365 ProPlus Microsoft Visual Studio Enterprise 2022
|
erstellt am: 14. Sep. 2015 14:35 <-- editieren / zitieren --> Unities abgeben: Nur für KMassler
Hallo Klaus Ich habe mal die TabPage-Extension von hier ins VB übersetzt.
Code: Public Module TabPageExtensions Private Structure TabPageData Friend Index As Integer Friend Parent As TabControl Friend Page As TabPage Friend Sub New(ByVal _index As Integer, ByVal _parent As TabControl, ByVal _page As TabPage) Index = _index Parent = _parent Page = _page End Sub Friend Shared Function GetKey(ByVal tabCtrl As TabControl, ByVal tabPage As TabPage) As String Dim key As String = "" If tabCtrl IsNot Nothing AndAlso tabPage IsNot Nothing Then key = [String].Format("{0}:{1}", tabCtrl.Name, tabPage.Name) End If Return key End Function End Structure Private hiddenPages As New Dictionary(Of String, TabPageData)() <System.Runtime.CompilerServices.Extension()> _ Public Sub SetVisible(ByVal page As TabPage, ByVal parent As TabControl) If parent IsNot Nothing AndAlso Not parent.IsDisposed Then Dim tpinfo As TabPageData Dim key As String = TabPageData.GetKey(parent, page) If hiddenPages.ContainsKey(key) Then tpinfo = hiddenPages(key) If tpinfo.Index < parent.TabPages.Count Then parent.TabPages.Insert(tpinfo.Index, tpinfo.Page) Else ' add the page in the same position it had parent.TabPages.Add(tpinfo.Page) End If hiddenPages.Remove(key) End If End If End Sub <System.Runtime.CompilerServices.Extension()> _ Public Sub SetInvisible(ByVal page As TabPage) If IsVisible(page) Then Dim tabCtrl As TabControl = DirectCast(page.Parent, TabControl) Dim tpinfo As TabPageData tpinfo = New TabPageData(tabCtrl.TabPages.IndexOf(page), tabCtrl, page) tabCtrl.TabPages.Remove(page) hiddenPages.Add(TabPageData.GetKey(tabCtrl, page), tpinfo) End If End Sub <System.Runtime.CompilerServices.Extension()> _ Public Function IsVisible(ByVal page As TabPage) As Boolean Return page IsNot Nothing AndAlso page.Parent IsNot Nothing ' when Parent is null the tab page does not belong to any container End Function <System.Runtime.CompilerServices.Extension()> _ Public Sub CleanUpHiddenPages(ByVal page As TabPage) For Each info As TabPageData In hiddenPages.Values If info.Parent IsNot Nothing AndAlso info.Parent.Equals(DirectCast(page.Parent, TabControl)) Then info.Page.Dispose() End If Next End Sub End Module
Beispiel zum Ausblenden Code: TabPage2.SetInvisible() TabPage3.SetInvisible()
Beispiel zum Einblenden Code: TabPage2.SetVisible(TabControl1) TabPage3.SetVisible(TabControl1)
Gruss Andreas ------------------ 21 ist nur die halbe Antwort. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
KMassler Ehrenmitglied V.I.P. h.c. CAD Admin + Mädchen für Alles...
Beiträge: 2657 Registriert: 06.11.2000
|
erstellt am: 14. Sep. 2015 15:20 <-- editieren / zitieren --> Unities abgeben:
Hey Andreas, das ist mal wieder cool Ich versteh zwar nicht die Hälfte, aber es funktioniert und ich nehm's einfach mal sowie es ist. (Bist du sicher, dass du Konstrukteur bist und nciht Programmierer? ) @Klaus: Das arbeitet komischerweise auch wieder mit Methoden, die mein TabControl gar nicht anbietet (Remove...) ------------------ Klaus www.al-ko.com | mein Gästebuch Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Zerspanungsmechaniker als CNC-Einrichter (m/w/d) | Die Imm Cleaning Solutions GmbH entwickelt, konstruiert und produziert Oberflächenreinigungssysteme für industrielle Anwendungsbereiche aller Branchen. Wir zeichnen uns durch unsere qualitativen Produkte, eine hohe Flexibilität und durch gelebte Kundenorientierung aus. Bei unseren Kunden und Lieferanten genießen wir einen sehr guten Ruf. Da es unsere Mitarbeiter sind, die die Qualität unserer ... | Anzeige ansehen | Mechaniker |
|
KMassler Ehrenmitglied V.I.P. h.c. CAD Admin + Mädchen für Alles...
Beiträge: 2657 Registriert: 06.11.2000 SolidWorks Start 1999 ** CSWP 01/2008 ** Dell Precision 7540 mobile Workstation, 64GB, Quadro RTX 3000; SWX2020 SP5; SAP/PLM+ECTR; DriveWorks Pro; Programmierung: VBA, aktuell Visual Studio 2017/VB.Net
|
erstellt am: 14. Sep. 2015 15:47 <-- editieren / zitieren --> Unities abgeben:
@Klaus: Korrektur: War mein Fehler, ich habe immer nach sowas wie TabControl1.TabPages(index).Remove gesucht und nicht gefunden. Die Syntax ist eine andere: TabControl1.TabPages.Remove( <myTabpage>). Es gibt sie also doch, die vermissten Methoden. Dank eurer Beispiele hat sich der Knoten gelöst. @Andreas: Da ich die Tabs in meinem Fall nicht wieder herstellen muss, muss ich sie auch nicht zwischenspeichern. Damit geht's wieder auf die kurze Art: For t As Integer = TabGeneral.TabPages.Count - 1 To 0 Step -1 If TabGeneral.TabPages(t).Name <> "tpModelRight" Then 'die einzige Bedingung, die ich im Moment brauche. TabGeneral.TabPages.Remove(TabGeneral.TabPages(t)) End If Next Danke euch, dass ihr mir den Weg gewiesen habt [Edit]Zu meiner Ehrenrettung: Dispose oder Enabled etc. gibt's aber trotzem nicht! Da habe ich mich nicht komplett verrannt [/Edit] ------------------ Klaus www.al-ko.com | mein Gästebuch [Diese Nachricht wurde von KMassler am 15. Sep. 2015 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|