2009-06-01 7 views
5

Ho una finestra di dialogo WinForms che contiene 3 pulsanti di opzione. Sto usando ApplicationSettings per associare la proprietà controllata di ciascuno di questi controlli RadioButton, ma non fa quello che mi aspetto che faccia. Ora devo fare clic su ciascun pulsante di opzione due volte prima che venga controllato e il pulsante di opzione selezionato non venga mantenuto.Utilizzo di ApplicationSettings per memorizzare la proprietà selezionata per WinForms RadioButtons

Esiste una riga di codice che è necessario eseguire quando il modulo è chiuso e salva le impostazioni dell'utente?

Come eliminare il doppio clic sui pulsanti di opzione?

C'è un modo migliore per mantenere questo tipo di impostazioni utente? Ho una proprietà pubblica sulla classe della finestra di dialogo che ottiene/imposta un valore enum in base a quale pulsante di opzione è selezionato, ma non ho visto un modo semplice per legare la proprietà a un'impostazione utente.

Modifica: Avrei dovuto specificare che sto usando vb.net. Penso che significhi My.Settings invece di Properties.Settings.

risposta

3

posso rispondere a questa parte della tua domanda:

C'è una linea di codice che ho bisogno di eseguire quando il form viene chiuso che salva le impostazioni utente?

Le impostazioni dell'applicazione sono memorizzate nella classe Settings, nello spazio dei nomi Properties. La classe Settings ha una proprietà statica denominata Default, che rappresenta le impostazioni correnti per l'applicazione. Quindi, nell'evento di chiusura del tuo modulo principale, chiami:

Properties.Settings.Default.Save(); 

... per salvare le impostazioni.

Allo stesso modo è possibile ottenere le impostazioni in modo programmatico utilizzando il nome dell'impostazione: Properties.Settings.Default.MyRadioButtonState (o qualsiasi altra cosa l'abbiate chiamato).

+0

Grazie! Questo mi ha fatto andare nella giusta direzione. In vb.net è My.Settings anziché Properties.Settings.Default, ma a parte questo, funziona perfettamente. Ora ho solo un'impostazione e sto utilizzando la proprietà pubblica del modulo negli eventi Load e FormClosing. – CoderDennis

+0

Sul mio computer non è necessario salvare le impostazioni alla chiusura. Sono salvati automaticamente. L'unico problema è che devo fare clic due volte. – systemovich

5

di rispondere a questa parte della tua domanda:

Come faccio a eliminare la necessità di fare 2x clic sui pulsanti radio?

È possibile aggiungere il seguente gestore di eventi per l'evento Click di ciascuno dei tre componenti RadioButton (di cui le proprietà selezionati sono tenuti a Impostazioni applicazione) nel GroupBox:

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 

funziona, anche anche se ci vuole un mezzo secondo prima che un Controllo Radio incontrollato venga controllato dopo aver fatto clic su di esso.

Il motivo per il problema è stato spiegato due anni fa (nel 2008) nella sezione 5 del post Surviving WinForms Databinding sul blog Turbulent Intelect (Grazie, ohadsc, per il link):

Regola 5 : non legarsi a cliccabili pulsanti di scelta

so quanto grande sarebbe se si può solo vincolare il proprio mazzo di Radio pulsanti per una proprietà enum. Io davvero faccio il . Pensi che stai solo andando a collegando alcuni eventi Format e Parse per tradurre di nuovo al tuo enum, e tutto andrà bene. Sarebbe così dannatamente conveniente , se effettivamente funzionasse. Ma il WinForms non è tagliato per questo. Per 3 versioni complete ora (o si tratta di versioni 3.5 ?), Questo è stato il caso. È a causa dell'ordine di evento, che non è qualcosa che MS può andare accendere senza causare migliaia di sviluppatori per ottenere davvero cheesed spento.

Il problema tratta veramente basso per l' fatto che a differenza di altri dati di controlli proprietà, la proprietà Checked di un pulsante radio non cambia in realtà fino messa a fuoco lascia il pulsante di scelta. E come con tutte le WinForms controlla la messa a fuoco in realtà non lasciare il pulsante di scelta fino a dopo attenzione è data alla un altro controllo, e in effetti non fino dopo l'evento Click del controllo appena focalizzato ha sparato. Il risultato di questa , in quanto riguarda radiofoniche pulsanti, è che se si tenta di associare a loro, le proprietà legate a vostra origine dati saranno effettivamente in ritardo stato visivo tuoi pulsanti di opzione da uno scatto . Se si dispone di due soli pulsanti della radio , l'origine dati sarà esattamente di fronte allo stato visibile, finché non si sceglie un altro posto che non attivare un'azione che riferimenti quelle dell'origine dati proprietà. Il che può rendere questo un bug davvero esasperante da rintracciare. Ho quasi pensato di avere le allucinazioni.

Ora, in tutta onestà, è possibile eseguire . Ma è il kludgiest kludge che si è mai schiacciato. Va bene, forse non è poi così male ... ma è un incasinamento di sicuro. Ci vuole un sacco di lavoro per qualcosa che dovrebbe davvero essere già disponibile. Da quanto posso dire, l'unico modo per risolvere questo problema senza rinunciare al meccanismo di associazione dati è quello di essenzialmente rendere il proprio controllo RadioButton , con un cambio di proprietà e fine evento che è effettivamente utile. È possibile scrivere uno da zero, o sottoclasse RadioButton e sovrascrivere tutta la logica eventi con la gestione personalizzata del messaggio .

6

Grazie a Geoffrey Van Wyk e Ohadsc (per il collegamento), mi è venuto in mente il seguente controllo personalizzato. È fondamentalmente un frame personalizzato che implementerà automaticamente il codice di Geoffrey su tutti i radiobutton in esso contenuti. Il vantaggio è che ora è possibile utilizzare ApplicationSettings per associare la proprietà controllata del controllo e funzionerà come previsto.

Ecco il mio codice C# per rendere il controllo personalizzato:

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; 
     } 

    } 
Problemi correlati