VB Programm Initialisierung abfragen

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

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    VB Programm Initialisierung abfragen

    Hi,

    ich möchte über Check Boxes steuern, welche Spalten in einer Datagrid View angezeigt werden: Das geht recht einfach:

    VB.NET-Quellcode

    1. Private Sub ToggleFileView(sender As Object, e As EventArgs) Handles chkToggleFilesSize.CheckedChanged
    2. dgvFiles.Columns("itmFileSize").Visible = chkToggleFilesSize.Checked


    Ich kriege allerdings ein Problem, bei der Initialisierung des Programms. Die Flags werden wohl beim Starten des Programms gesetzt, BEVOR die Datagrid View initalisiert ist. Und damit kracht die Sache, weil

    dgvFiles.Columns("itmFileSize")

    "nothing" ist.

    Natürlich kann ich das umgehen:

    VB.NET-Quellcode

    1. If Not dgvFiles.Columns("itmFileAttributes") Is Nothing Then _
    2. dgvFiles.Columns("itmFileAttributes").Visible = chkToggleFilesAttributes.Checked


    Das funktioniert dann schon. Aber das sieht erstens "blöde" aus ... und zweitens habe ich eine ganze Latte von ähnlichen Flags. Das müsste doch eleganter gehen !

    Wie kann ich denn abfragen, ob sich mein Programm in der Initialisierungsphase befindet? Irgendwie finde ich da nix passendes.

    Ich hoffe, ich habe mein Problem verständlich machen können.

    LG
    Peter

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Peter329“ ()

    Da gab's schon mal ein ähnliches Problem inkl. Lösungen.
    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.
    @Peter329 Der Konstruktor der Form ruft ein InitializeComponents() auf, danach sind alle Controls instanziiert.
    Wenn Du per Binding das DGV befüllst, machst Du das, sofern per Code, danach.
    Nun kann es passieren, dass beim Checken von CheckBoxen oder Selektieren von Indizes die Prozeduren aufgerufen werden und Du willst es nicht, weil noch nicht alle Daten vorliegen.
    Da mach Dir ein Init-Flag, vor dem Konstruktor auf True, nach dem Bereitstellen aller Daten auf False.
    In den betroffenen Eventhandlern prüfst Du das Flag und machst Return bei True.
    Dann musst Du alle Eventhandler einzeln aufrufen, die erforderlich sind, um die Initialisierung abzuschließen.

    VB.NET-Quellcode

    1. Private Flag As Boolean
    2. Public Sub New()
    3. Flag = False
    4. InitializeComponents()
    5. InitStuff1()
    6. Flag = False
    7. InitStuff2()
    8. End Sub
    9. Private Sub MyHandler(sender As Object, e As EventArgs) Handles Any.CheckedChanged
    10. If Flag Then Return
    11. ' Do Any
    12. End Sub

    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!
    Ok, danke erst mal an euch beide ! Jetzt verstehe ich das Problem. Und vor allem verstehe ich, warum das bei einigen Spalten geklappt hat und bei anderen nicht ! Da bin ich fast daran verzweifelt. :)

    Das Ganze passiert also, wenn man eine CheckBox bereits im Designer mit dem Häkchen versieht.

    Wenn ich einfach alle Checkboxes unausgewählt lasse und die Häkchen dann in der Load Prozedur setze ist alles Paletti !

    Ansonsten muss man halt mit dem von RFG erwähnten Schalter arbeiten. Oder eben doch auf "nothing" abfragen ... was dann ja auch nicht unbedingt so viel uneleganter ist.

    Danke für die Ratschläge !

    LG
    Peter
    jo - alle checkboxen "undesigned" lassen ist die eine möglichkeit.
    Alternativ kannste sie auch wie nachwievor designen, entfernst aber bei den event-Handler-Methoden die Handles-Klausel.

    Und abonnierst die Handler erst, wenn InitializeComponents bereits durchgelaufen ist.

    Aber ist eiglich egal - gehupft wie gesprungen.
    Jdfs es ist die Handles-Klausel, mit der ein Event sofort abonniert wird, sobald das Control im DesignerCode erstellt ist. Und dieses frühe Abonnieren ist halt zu früh, und weiterer Designercode löst dann Events aus und damit Logik, für die die Vorraussetzungen evtl. noch nicht vorhanden sind.