Ich beantworte diesen Teil Ihrer Frage:
Wie kann ich verhindern, dass ich zweimal auf die Optionsfelder klicken muss?
Sie können den folgenden Event-Handler zum Click-Ereignis jeder der drei RadioButtons (deren Checked-Eigenschaften an die Anwendungseinstellungen gebunden sind) in Ihrer GroupBox hinzufügen:
Private Sub RadioButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles tomRadioButton.Click, dickRadioButton.Click, harryRadioButton.Click
If sender.Checked = False Then
sender.Checked = True
End If
End Sub
Es funktioniert, auch wenn es eine halbe Sekunde dauert, bis ein nicht angeklickter RadioButton nach dem Anklicken geprüft wird.
Der Grund für dieses Problem wurde vor zwei Jahren (2008) in Abschnitt 5 der WinForms-Datenbindung überleben Beitrag auf dem Blog Turbulent Intelect (Danke, ohadsc , für den Link):
Regel 5: Binden Sie nicht an anklickbare Radio-Buttons
Ich weiß, wie toll es wäre, wenn Sie wenn man einfach eine Reihe von Optionsfeldern an eine Enum-Eigenschaft binden könnte. Das weiß ich wirklich wirklich. Sie denken, Sie werden einfach einige Format- und Parse-Ereignisse einbinden zurück zu Ihrer Aufzählung übersetzen, und und alles wird gut sein. Es wäre so verdammt praktisch, wenn es tatsächlich funktionieren würde. Aber WinForms ist einfach nicht dafür gemacht. Seit nunmehr 3 vollständigen Versionen (oder ist es 3.5 Versionen?) ist dies der Fall gewesen. Es ist wegen der Reihenfolge der Ereignisse, die ist nicht etwas, dass MS gehen kann ändern kann, ohne dass Tausende von von Entwicklern wirklich verärgert sind verärgert sind.
Das eigentliche Problem liegt in der Tatsache, dass im Gegensatz zu den Daten anderer Kontrollen Eigenschaften eines Steuerelements, die Eigenschaft Checked eines Optionsfeldes nicht wirklich ändert bis der Fokus das Optionsfeld verlässt. Und wie bei allen WinForms Steuerelementen wird der verlässt der Fokus das Optionsfeld nicht wirklich erst, nachdem der Fokus auf ein anderes ein anderes Steuerelement gegeben wird, und zwar erst nachdem das Click-Ereignis des neu fokussierten Steuerelements ausgelöst hat. Das Ergebnis daraus, wie es sich auf Optionsfelder bezieht Schaltflächen betrifft, ist, dass, wenn Sie versuchen, zu binden sie zu binden, die gebundenen Eigenschaften in Ihrem Datenquelle verzögern tatsächlich Ihr visuellen Zustand der Optionsschaltflächen um einen Klick . Wenn Sie nur zwei Optionsfelder haben Schaltflächen haben, wird die Datenquelle genau gegenüber dem sichtbaren Zustand, bis Sie irgendwo anders klicken, das nicht eine Aktion auslöst, die die auf diese Datenquelle Eigenschaften verweist. Was dies zu einem wirklich ärgerlichen Fehler aufspüren. Ich dachte fast, ich würde halluzinieren.
Ehrlich gesagt, ist es möglich, dass es zum Laufen zu bringen. Aber es ist der plumpeste Klotz, der je geklotzt hat. Okay, vielleicht ist es nicht so schlimm ... aber es ist ein chaotischer hack für sicher. Es macht eine Menge Arbeit für etwas, das eigentlich bereits verfügbar sein sollte. So weit ich das beurteilen kann kann ich sagen, dass der einzige Weg zur Lösung dieses Problem zu lösen, ohne auf den Datenbindungsmechanismus aufzugeben, ist im Wesentlichen Ihr eigenes RadioButton Steuerelement zu erstellen, mit einer Eigenschaftsänderung und Ereignisreihenfolge, die tatsächlich nützlich ist. Sie können entweder eines von Grund auf neu schreiben, oder die Unterklasse RadioButton verwenden und die die gesamte Ereignislogik mit benutzerdefinierter Nachrichtenbehandlung.