Checkbox Problem mit 2ter Form

  • VB.NET

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von einfach112.

    Checkbox Problem mit 2ter Form

    Hallo !
    Ich habe da mal wieder ein kleines Problem!
    Ich habe aktuell 2 Formen
    Form 1 mit dem Hauptprogramm.
    Auf Form 2 kann man Einstellungen vornehmen.
    Auf Form 2 ist eine Checkbox vorhanden.
    Wenn der User dort ein häckchen setzt oder entfernt würde ich gerne dementsprechen mit einer Messagebox reagieren.
    Ich gehe mal davon aus das ich im folgenden Bereich richtig bin oder?

    VB.NET-Quellcode

    1. Private Sub CheckBox1_CheckedChanged(sender As Object, e As EventArgs) Handles CheckBox1.CheckedChanged
    2. End Sub

    doch wenn ich dort eingebe:

    VB.NET-Quellcode

    1. msgbox("Gute Wahl!")

    wird die Messagebox nicht nur dann angezeigt wenn dort jemand drauf klickt sondern auch schon wenn der User von form1 auf form2 wechselt.
    Der Wechsel von Form1 auf Form 2 kommt über:
    Form2.ShowDialog()
    Doch da sollte die Message ja nicht kommen!
    Wo ist jetzt mein Gedankenfehler?

    Vielen Dank im voraus
    einfach112

    ~blaze~: Thema verschoben

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

    Kein Gedankenfehler, nur eine fehlende Information. Ich vermute mal, dass Du Deine messageBox-gekoppelte CheckBox so eingestellt hast, dass sie schon ein Häkchen hat. Wenn Du Deine Form2 aufrufst, initialisiert Dein Programm die Form2, es bereitet die Steuerelemente vor. Das ist in der Datei Form2.Designer.vb zu sehen (Projektmappen-Explorer -> Alle Dateien zeigen -> [+] Form2 -> Form2.Designer.vb). Dort dürfte es eine Zeile geben, die ungefähr lautet: "Me.CheckBox1.CheckState = System.Windows.Forms.CheckState.Checked". Sie gibt der CheckBox eine voreingestellte Eigenschaft, nämlich die, die Du im Designer eingestellt hast. Das führt allerdings dazu, dass das CheckBox1_CheckedChange-Event losgeht, was dazu führt, dass Deine MessageBox aufploppt. Eine Variante (die mir aufgrund der späten Stunde als einziges einfällt) ist folgendes:

    VB.NET-Quellcode

    1. Public Class Form2
    2. Private FormWasLoadedCompletely As Boolean = False
    3. Private Sub Form2_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    4. 'all Dein Initialisierungscode, falls vorhanden
    5. FormWasLoadedCompletely = True
    6. End Sub
    7. Private Sub CheckBox1_CheckedChanged(sender As System.Object, e As System.EventArgs) Handles CheckBox1.CheckedChanged
    8. If FormWasLoadedCompletely Then MessageBox.Show("Eine gute Wahl!")
    9. End Sub
    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.

    einfach112 schrieb:

    Wo ist jetzt mein Gedankenfehler?
    Weil Du VB6 denkst, nicht aber VB.NET.
    Lese, verstehe und beherzige dies: Instanziierung von Forms und Aufruf von Dialogen.
    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!

    einfach112 schrieb:

    nicht wirklich weiter geholfen
    Dann empfehle ich Dir dringend, so lange mit mehreren Formen zu pausieren, bis Du es verstanden hast.
    Ansonsten hachst Du hier Threads auf, weil Du Probleme damit hast, wenn Daten zwischen Formen ausgetauscht werden sollen.
    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!
    Hmm - anzumerken, dass das Form hier zwar eindeutig falsch instanziert wird, aber aufs Problemverhalten hat das keinen Einfluss, daher ist wohl mit nur wenig Einsicht seitens Einfach112 zu rechnen.

    Um @VaporiZeds Code zu verbessern:

    VB.NET-Quellcode

    1. Public Class Form2
    2. Private Sub Form2_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    3. 'all Dein Initialisierungscode, falls vorhanden
    4. AddHandler CheckBox1.CheckedChanged, AddressOf CheckBox1_CheckedChanged ' AddHandler statt Handles-Klausel
    5. End Sub
    6. Private Sub CheckBox1_CheckedChanged(sender As System.Object, e As System.EventArgs) ' keine Handles-Klausel!
    7. If FormWasLoadedCompletely Then MessageBox.Show("Eine gute Wahl!")
    8. End Sub
    Bleibt noch zu hoffen, dass @einfach112 sich für die Hintergründe zu interessieren beginnt.
    Jdfs der Unterschied (einer von mehreren) ist, dass die Handles-Klausel das Event zum frühest-möglichen Zeitpunkt abonniert, und das ist in diesem Falle zu früh.
    Alles über Events

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