Eingebettete Controls im FlowlayoutPanel immer Visible=false

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Eingebettete Controls im FlowlayoutPanel immer Visible=false

    Hallo,

    ich habe ein kleines Problem mit dem FlowlayoutPanel. Folgendes Szenario:
    In einem Formular ist eine ComboBox, in welcher eine Auftragsart ausgewählt wird. Des weiteren gibt es mehrere (20+) Eingabefelder, welche je nach Auftragsart befüllt werden. Als Beispiel:
    Auftragsart 1 -> Feld 1 und Feld 2
    Auftragsart 2 -> Feld 2
    Auftragsart 3 -> Feld 1 und Feld 3
    Auftragsart 4 -> Feld 1 und Feld 2 und Feld 3

    Ich habe mich also dazu entschieden, jedes Eingabefeld mit seinem passenden Label in ein Panel zu packen. Diese Panels liegen in einem FlowlayoutPanel. Nun blende ich je nach Auswahl der Auftragsart die entsprechenden Panels ein bzw aus. Dazu habe ich im Tag der Panels hinterlegt, welche Panels bei welcher Auftragsart sichtbar sein soll.

    Code beim wechseln der Auftragsart:

    VB.NET-Quellcode

    1. For Each ctrl As Panel In Me.StammdatenFlowLayoutPanel.Controls.OfType(Of Panel)
    2. If strAarAuftragsart = "" Then
    3. ctrl.Visible = False
    4. ElseIf ctrl.Tag Is Nothing Then
    5. ctrl.Visible = False
    6. ElseIf ctrl.Tag.ToString = "*" OrElse ctrl.Tag.ToString.Contains(String.Concat(strAarAuftragsart, "*")) Then
    7. ctrl.BackColor = Color.OldLace
    8. ctrl.Visible = True
    9. ElseIf ctrl.Tag.ToString = "#" OrElse ctrl.Tag.ToString.Contains(strAarAuftragsart) Then
    10. ctrl.BackColor = Color.Transparent
    11. ctrl.Visible = True
    12. Else
    13. ctrl.Visible = False
    14. End If
    15. If bolAuswahl = True AndAlso ctrl.Visible = False Then fncVerstecktePanelsLeeren(ctrl)
    16. Next

    Nun will ich den Inhalt aller TextBoxen und ComboBoxen in den Panels leeren, das sollte eigentlich die Zeile nach dem End If machen. Nur ist dort ctrl.visible immer False, auch wenn die Panels richtig angezeigt bzw ausgeblendet sind. Ich könnte zwar die Funktion zum leeren der Inhalte bei jeder Stelle einfügen, wo ich ctrl.Visible = False setze, fand meine Variante aber sinnvoller.

    Hat jemand eine Idee woran das liegen könnte?

    AndPod schrieb:

    Nur ist dort ctrl.visible immer False,
    So ist das, wenn Du nur diejenigen Panels berücksichtigst, die .Visible = False sind.

    AndPod schrieb:

    VB.NET-Quellcode

    1. If bolAuswahl = True AndAlso ctrl.Visible = False Then fncVerstecktePanelsLeeren(ctrl)
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Warum sollte in Zeile 15 ctrl.visible immer false sein? Der Befehl dort ist außerhalb des If-Blocks. Und wie erwähnt, die Panels werden korrekt ein/ausgeblendet, es werden halt aber auch eingeblendete geleert.
    Hier noch ein Bild von den Einzelschritten. Dort sieht man das er in der ElseIf-Bedingung Zeile 6-8 (615-617 im Bild) Visible auf True setzen müsste. Lustigerweise ist das Panel an der Stelle sogar schon auf Visible, auch wenn mir VS da was anderes erzählen will

    AndPod schrieb:

    das sollte eigentlich die Zeile nach dem End If machen

    AndPod schrieb:

    Warum sollte in Zeile 15 ctrl.visible immer false sein?
    Diese Frage musst Du uns beantworten.
    Kann es sein, dass Du Deinen eigenen Code nicht ganz verstehst?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Dann hilf mir auf die Sprünge. Ich habe eine Schleife, in der alle Panels innerhalb eines Flowlayoutpanels durchlaufen werden. Innerhalb dieser Schleife gibt es einen If-Block mit mehreren ElseIf-Abschnitten. Je nachdem welche Bedingung zutrifft wird der Visible Status des aktuellen Panels auf True oder False gesetzt. Innerhab der Schleife aber außerhalb des If-Blocks prüfe ich im Anschluss, ob das Panel Visible=false ist um eine andere Funktion auszuführen. Das ist zumindest der Code der oben steht, oder wo ist der Fehler? An welcher Stelle prüfe ich denn deiner Meinung nach nur die Panels, die ohnehin Visible=false sind?
    Des weiteren steht der Visible Status des Panels scheinbar prinzipiell auf False, auch wenn die im Screenshot angezeigte Bedingung den auf True setzt. Das Panel selber ist auch (nicht) sichtbar, der Code den ich wohl nicht verstehe macht diesbezüglich also genau das was er soll.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „AndPod“ ()

    Den Grund, warum an der von dir genannten Stelle ctrl.Visible ungeachtet des vorherigen Verlaufs auf False steht, kann ich dir spontan nicht nennen.
    An deiner Stelle würde ich in diesem Fall hergehen, und eine separate Boolean-Variable nehmen, statt die Visible-Eigenschaft direkt zu setzen. Dann weist du am Ende an zentraler Stelle diesen Wert der Eigenschaft ctrl.Visible zu und hast zusätzlich die Möglichkeit, statt der Eigenschaft deine Variable auf True oder False zu testen um fncVerstecktePanelsLeeren() aufzurufen oder nicht.
    Sollte das Panel tatsächlich aus irgendeinem Grund beim Lesen des Visible-Propertys einen falschen Wert zurückgeben (false, obwohl es vorher auf true gesetzt wurde und danach auch sichtbar ist), umgehst du damit dieses Problem.
    Sollte das Panel nach Abhandeln deines Codes sich aber schlussendlich tatsächlich als unsichtbar entpuppen, obwohl es deiner Meinung nach sichtbar sein sollte, hast du dann die Gewissheit, dass es irgendwo anders noch knirschen müsste - vielleicht irgendein weiteres Event, das dir dazwischen funkt.
    Weltherrschaft erlangen: 1%
    Ist dein Problem erledigt? -> Dann markiere das Thema bitte entsprechend.
    Waren Beiträge dieser Diskussion dabei hilfreich? -> Dann klick dort jeweils auf den Hilfreich-Button.
    Danke.
    Anderer Vorschlag: Sobald Du beim Haltepunkt von ctrl.Visible = True angekommen bist, mach das Einzelschrittverfahren (F11). Vielleicht taucht dann ganz plötzlich auf, dass danach nicht mit Zeile#15 (bzw. #625 im Screenshot) (If bolAuswahl = True AndAlso ...) weitergemacht wird, sondern irgendeine Prozedur aufgerufen wird. Oder sonstewas überraschendes passiert.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    AndPod schrieb:

    Mehr passiert da wirklich nicht.
    Manche Events, die zwischen den Einzelschritten ausgelöst werden, bekommt man leider nicht immer mit, solange man dort nicht auch Haltepunkte setzt.
    Weltherrschaft erlangen: 1%
    Ist dein Problem erledigt? -> Dann markiere das Thema bitte entsprechend.
    Waren Beiträge dieser Diskussion dabei hilfreich? -> Dann klick dort jeweils auf den Hilfreich-Button.
    Danke.

    Arby schrieb:

    solange man dort nicht auch Haltepunkte setzt.
    Jou.
    @AndPod Lerne zu debuggen: Debuggen, Fehler finden und beseitigen
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    AndPod schrieb:

    wenn die jeweilige TabPage nicht ausgewählt ist
    ist sie und ihre Controls nicht sichtbar, also .Visible = False.
    Ob das nun von Deinem Code (explizizes Hiden eines Controls) oder vom Framework (Hiden einer hinten liegenden TabPage) kommt, ist da sekundär.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!