Wie Sie verhindern, dass der Wert geändert Ereignissen von brennen auf der form-Initialisierung .NET?
Betrachten Sie eine einfache .NET-Formular mit ein paar radio-buttons und eine checkbox.
Einzelnen radio-buttons hat eine CheckedChanged-handler-setup, führt einige Aktionen basierend auf dem Status der checkbox.
Mein problem ist, wenn ich initialisieren auf Standard-radiobutton aktiviert sein (aus dem designer-Fenster Eigenschaften) das CheckedChanged-Ereignis ausgelöst wird für das radio-button, aber die Checkbox noch nicht initialisiert wurde, aber ich erhalte entweder eine null-Zeiger-Ausnahme oder der falsche Wert wird verwendet in der hf. So oder so, ich will nicht, dass die handler-code ausgeführt werden, es sei denn, der Benutzer wählt einen radio-Taste, nachdem die form geladen wurde.
Ich derzeit dies umgehen, indem nicht die Initialisierung der radio Buttons, aber muss ich das einstellen, dass standardmäßig schließlich, und der beste Ort ist von dem designer. Ich kann auch hinzufügen, ein boolean Feld, das nicht auf true gesetzt, bis das Formular vollständig geladen ist und nicht die Verarbeitung der Ereignisse, wenn das falsch ist, aber es ist ein schmutziger hack.
Was kann ich tun, um zu verhindern, dass die Prozedur ausgeführt seinen code?
Es ist eine bekannte bug/feature. Wenn Sie ein upgrade von VB6-Projekt VB.NET über die integrierte upgrade-Tools in VS, es tatsächlich fügt UPGRADE_WARNING Kommentare für diesen bei diesen Veranstaltungen. (
'UPGRADE_WARNING: Event TextBox1.TextChanged may fire when form is initialized.
)Und für die Nachwelt, in dem MSDN-Artikel auf, wie mit der Warnung zitiert in @awe Kommentar: msdn.microsoft.com/en-us/library/26aab97z%28v=vs.71%29.aspx: IsInitializing "true im Formular-Konstruktor nur vor dem InitializeComponent - Aufruf; stellen Sie es auf false unmittelbar nach dem Anruf."
InformationsquelleAutor CodeFusionMobile | 2010-06-30
Du musst angemeldet sein, um einen Kommentar abzugeben.
"Ich kann auch setzen Sie ein Boolesches Feld, das nicht auf true gesetzt, bis das Formular vollständig geladen ist und nicht die Verarbeitung der Ereignisse, wenn das falsch ist, aber es ist ein schmutziger hack."
Es ist auch der einfachste und beste Weg, es zu tun!
Sagen .NET bietet eine saubere Art und Weise zu drehen ein-und ausschalten alle event-Handler, bis das Formular geladen ist. Auch nur diejenigen, die SIE behandeln. Es wäre immer noch nicht ausreichend flexibel zu deaktivieren, was Sie wollte aktivieren, aber deaktivieren, was du nicht. Oft bilden setups passieren, und Sie möchten, dass die Ereignisse um das Feuer. Auch die form wird nicht bauen Recht, wenn keine Ereignisse ausgelöst.
Ich musste eine Dusche nehmen, nachdem ich schrieb diese Antwort.
InformationsquelleAutor FastAl
Machen es sich etwas weniger schmutzig, wenn Sie das initialisieren der Steuerelemente im Konstruktor der form, die Sie vielleicht in der Lage sein, um die Formulare verwenden IsHandleCreated Eigenschaft als Ihre eigenen bool zu überprüfen, sollte es sich bestätigen oder nicht.
Ich würde denken, dass normalerweise würden Sie nicht wollen, um zu überprüfen alles, bevor es wurde zum ersten mal gezeigt und handle nicht erstellt, bis es ist.
Code Beispiel:
IsHandleCreated
in den Veranstaltungen alles gelöst!Dies sollte die Antwort sein.
InformationsquelleAutor Hans Olsson
Die einfache Lösung deklarieren Sie eine variable initialisieren:
Modernsten: Entfernen Sie die "handles" von der Methode, und verwenden Sie
AddHandler
auf die neue Methode.InformationsquelleAutor x77
Für
radiobutton
siehe Hans Olsson AntwortFür numeric-up-down, tun Sie es wie diese
Ist das Stichwort
myNumeric.Value
undIsHandleCreated
IsHandleCreated
ist der trick hier, und ist besser als die Boolean-hack, IMO. Ich benutzeIf CType(sender, NumericUpDown).IsHandleCreated Then ...
innerhalb derValueChanged
handler.InformationsquelleAutor Cary Bondoc
Noch einen anderen Weg:
InformationsquelleAutor Kristian
Eine Sache, die ich gefunden habe, das funktioniert, ist das hinzufügen der Ereignisse manuell nach dem laden der form.
Dazu gehen Sie einfach in die erzeugte form-code finden Sie in der designer-Datei des Formulars, und ziehen Sie die Linien, fügen Sie die Veranstaltung. Es würde in etwa so Aussehen:
Dann alle diese Aufrufe in eine Methode, die Sie anrufen, nach dem Aufruf InitializeComponent im Konstruktor des Formulars.
InformationsquelleAutor Zach
Nur falls jemand noch auf der Suche nach diesem das Ereignis ausgelöst wird bei der Initialisierung der form, ABER die form ist noch nicht sichtbar, Auch Sagen, dass Sie eine foreign key-Beziehung, auf die Sie einen Standardwert benötigt-Problem, das gefeuert wird jede Zeile, die aktualisiert sich auch. Also der folgende code funktionierte für mich....
InformationsquelleAutor Jeff
(Mit VS 2017) erscheint Es mir, dass es ist ein ärgernis, aber kein bug. Es ist konsistent mit dem Modell im Einsatz. Das Ereignis wird ausgelöst, indem der normale Betrieb der code, aber code habe ich nicht schreiben können, aber der Zugang, wo Narren fürchten um zu beschreiten), und wo es scheint keine (anständige) früher in den normalen Ablauf zu antizipieren.
Die sauberste Antwort scheint zu sein, nicht zu überprüfen, radio-button oder checkbox-Steuerelemente im designer an, wenn Sie auslösen, die erhebliche code. Stattdessen werden diese Kontrollen sollten geändert werden, indem code (z.B. checked = true) in das Load-Ereignis (zum Beispiel) NACH all der Initialisierung erfolgt.
Gibt es keinen Verlust an Flexibilität, da sich beide fest vor zu bauen, nur an verschiedenen Orten. Der event-Handler behandeln es genau so, wie wenn ein Benutzer angeklickt hatten die Kontrolle in den natürlichen Fluss einer gut gestalteten GUI-Anwendung. (Das erinnert mich an die alten RPG-Sprichwort "Don' T buck den Zyklus". (Jemand hier, denken Sie daran RPG? Ich, die nicht Bestandteil der IBM-orientiertes team, es nie benutzt, aber hatte interessante Diskussionen mit einigen, hat. ) Pre-checking-Kontrollen trifft die falschen Teil der VS-Zyklus.)
Wenn aus irgendeinem Grund, der nicht funktioniert, ist die nächste beste Sache ist, die Unordnung vorgeschlagen, die anderswo von einem einzigen status boolean initialisiert mit false und true in der entsprechenden Zeit mit bedingter Ausfahrten in die notwendigen Plätze zu verhindern, dass Sie Abstürzen, bis dann. Es wird den job zu erledigen, aber es ist hässlich. Besser als Misserfolg.
Andere Sache, die ich versuchte, bevor ich beschlossen, dass designer-Ebene-pre-set-Prüfungen waren das problem und es war eine sehr annehmbare alternative war, den Gefahrenstellen in einen Try..Catch-in der Lage sein zu ignorieren, die Ausnahme. Auch ein Schlamassel.
InformationsquelleAutor RDeLisle
Vielleicht für einige Funktionen können Sie verwenden Sie das click-Ereignis anstelle von das check-changed-Ereignis.
InformationsquelleAutor JaJa
Ich eine öffentliche variable in der Datei Module1
Dim Öffentliche bolForm_LoadingTF as Boolean = True
In jedem formLoad-Ereignis legte ich
bolForm_LoadingTF = True
In jede Steuerung mit einem OnSelectedIndexChanged
Veranstaltung, die ich setzen, wenn bolForm_LoadingTF = True then Exit Sub
Am Ende der form-load-Ereignis legte ich
bolForm_LoadingTF = False
Bin ich wahrscheinlich gegen eine Reihe von Vorschriften, aber das funktioniert
für mich.
InformationsquelleAutor Harold Clements