5 Stimmen

Verwendung von ApplicationSettings zum Speichern der Eigenschaft Checked für WinForms RadioButtons

Ich habe ein WinForms-Dialogfeld, das 3 Optionsfelder enthält. Ich verwende ApplicationSettings um die Eigenschaft "Checked" für jede dieser RadioButton Steuerelemente, aber sie tun nicht das, was ich von ihnen erwarte. Jetzt muss ich jedes Optionsfeld zweimal anklicken, bevor es aktiviert wird, und das ausgewählte Optionsfeld wird nicht beibehalten.

Gibt es eine Codezeile, die ich ausführen muss, wenn das Formular geschlossen wird, um die Benutzereinstellungen zu speichern?

Wie kann ich verhindern, dass ich zweimal auf die Optionsfelder klicken muss?

Gibt es eine bessere Möglichkeit, diese Art von Benutzereinstellung beizubehalten? Ich habe eine öffentliche Eigenschaft auf der Dialogfeldklasse, die einen Enum-Wert auf der Grundlage der Optionsschaltfläche aktiviert/deaktiviert, aber ich habe nicht sehen, eine einfache Möglichkeit der Bindung dieser Eigenschaft an eine Benutzereinstellung.

編集する。 Sollte angegeben haben, dass ich vb.net verwende. Ich denke, das bedeutet My.Settings 代わりに Properties.Settings .

6voto

Geoffrey Punkte 5277

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.

6voto

BriL Punkte 61

Dank Geoffrey Van Wyk und ohadsc (für den Link) habe ich das folgende benutzerdefinierte Steuerelement entwickelt. Es ist im Grunde ein benutzerdefinierter Rahmen, der Geoffreys Code automatisch für alle darin enthaltenen Radiobuttons implementiert. Der Vorteil ist, dass Sie jetzt ApplicationSettings verwenden können, um die Eigenschaft checked des Steuerelements zu binden, und es wird so funktionieren, wie es soll.

Hier ist meine c#-Code, um die benutzerdefinierte Steuerung zu machen:

 public partial class RadioPanel : System.Windows.Forms.Panel
    {
        protected override void OnControlAdded(ControlEventArgs e)
        {
            base.OnControlAdded(e);
            var radioButton = e.Control as RadioButton;
            if (radioButton != null)
                radioButton.Click += radioButton_Click;
        }

        void radioButton_Click(object sender, EventArgs e)
        {
            var radio = (RadioButton)sender;
            if (!radio.Checked)
                radio.Checked = true;
        }

    }

3voto

Matt Hamilton Punkte 193704

Diesen Teil Ihrer Frage kann ich beantworten:

Gibt es eine Codezeile, die ich ausführen muss, wenn das Formular geschlossen wird, um die Benutzereinstellungen zu speichern?

Die Anwendungseinstellungen werden in Ihrem Settings Klasse, in der Properties Namensraum. Der Settings Klasse hat eine statische Eigenschaft namens Default der die aktuellen Einstellungen für Ihre Anwendung darstellt. Im Ereignis "Schließen" Ihres Hauptformulars rufen Sie also auf:

Properties.Settings.Default.Save();

... um die Einstellungen zu speichern.

Ebenso können Sie die Einstellungen programmatisch über den Namen der Einstellung aufrufen: Properties.Settings.Default.MyRadioButtonState (oder wie auch immer Sie es genannt haben).

0 Stimmen

Danke! Das brachte mich in die richtige Richtung. In vb.net ist es My.Settings anstelle von Properties.Settings.Default, aber anders als das, es funktioniert perfekt. Ich habe jetzt nur eine Einstellung und verwende die öffentliche Eigenschaft des Formulars in den Ereignissen Load und FormClosing.

0 Stimmen

Auf meinem Computer ist es nicht notwendig, die Einstellungen beim Schließen zu speichern. Sie werden automatisch gespeichert. Das einzige Problem ist, dass ich zwei Mal klicken muss.

3voto

Ohad Schneider Punkte 34748

Dieses Verhalten wird in Punkt 5 erläutert:

http://turbulentintellect.blogspot.com/2008/07/surviving-winforms-databinding.html

Eine mögliche Lösung wäre eine benutzerdefinierte GroupGox: Der beste Weg, um eine Gruppe von Radiobuttons in WinForms databinden

0 Stimmen

Danke für die Antwort. Ich hatte vergessen, diese Frage überhaupt zu stellen!

0 Stimmen

Mit Vergnügen! Danke für den Hinweis :)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X