Pulsante di scelta vincolante WinForm

Io uso VS2010 e quindi trascino e rilasciare il datagridview di membro per progettare la vista. Dopo di che trascino e rilasciano il campo di testo membro nome per progettare la vista e poi provare a modificare e salvare. Funziona correttamente.

E poi trascino e rilasciamo il pulsante della radio del sesso per progettare la vista. Ma legarlo non funziona.

Come posso bind in questa situazione?

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace Test7 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void memberBindingNavigatorSaveItem_Click(object sender, EventArgs e) { this.Validate(); this.memberBindingSource.EndEdit(); this.tableAdapterManager.UpdateAll(this.dbDataSet); } private void Form1_Load(object sender, EventArgs e) { // TODO: This line of code loads data into the 'dbDataSet.Member' table. You can move, or remove it, as needed. this.memberTableAdapter.Fill(this.dbDataSet.Member); // TODO: This line of code loads data into the 'dbDataSet.Member' table. You can move, or remove it, as needed. this.memberTableAdapter.Fill(this.dbDataSet.Member); } private void memberBindingNavigatorSaveItem_Click_1(object sender, EventArgs e) { this.Validate(); this.memberBindingSource.EndEdit(); this.tableAdapterManager.UpdateAll(this.dbDataSet); } } } 

inserisci la descrizione dell'immagine qui

Ecco due possibili soluzioni.


Eventi Binding Format e Parse

La class Binding ha una funzione integrata per trasformazioni al volo di dati associati sotto forma di eventi Format e Parse .

Ecco come useresti quegli eventi con il solo pulsante “Maschio”. Crea l’associazione nel codice, non nel designer:

 // create binding between "Sex" property and RadioButton.Checked property var maleBinding = new Binding("Checked", bindingSource1, "Sex"); // when Formatting (reading from datasource), return true for M, else false maleBinding.Format += (s, args) => args.Value = ((string)args.Value) == "M"; // when Parsing (writing to datasource), return "M" for true, else "F" maleBinding.Parse += (s, args) => args.Value = (bool)args.Value ? "M" : "F"; // add the binding maleRb.DataBindings.Add(maleBinding); // you don't need to bind the Female radiobutton, just make it do the opposite // of Male by handling the CheckedChanged event on Male: maleRb.CheckedChanged += (s, args) => femaleRb.Checked = !maleRb.Checked; 

Proprietà calcasting

Un altro approccio consiste nell’aggiungere una proprietà calcasting all’origine dati:

 public bool IsMale { get { return Sex == "M"; } set { if (value) Sex = "M"; else Sex = "F"; } } 

Ora puoi semplicemente associare il pulsante radio Maschio a questa proprietà sulla tua origine dati (solo non mostrare questa proprietà nella griglia).

E ancora puoi colbind Femmina a Maschio in questo modo:

 maleRb.CheckedChanged += (s, args) => femaleRb.Checked = !maleRb.Checked; 

Mentre mi rendo conto che è già stata data una risposta, ho pensato di fornire un’opzione che desse capacità di bind il tempo di progettazione.

Crea un nuovo object RadioButton personalizzato. Questo è fatto con il seguente codice.

 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows.Forms; namespace MSLabExample { class RadioButtonBind : RadioButton { private string _selectValue = string.Empty; public string SelectValue { get { return _selectValue; } set { if (value == Text) Checked = true; else Checked = false; _selectValue = value; } } public RadioButtonBind() { this.CheckedChanged += new EventHandler(RadioButtonBind_CheckedChanged); this.TextChanged += new EventHandler(RadioButtonBind_TextChanged); } void RadioButtonBind_TextChanged(object sender, EventArgs e) { if (Checked) _selectValue = Text; } void RadioButtonBind_CheckedChanged(object sender, EventArgs e) { if (Checked) _selectValue = Text; } } } 

Il concetto di base del controllo precedente consiste nell’utilizzare un valore stringa che può essere associato e verificherà se il valore della stringa associata è uguale al testo del pulsante di opzione.

Usando il testo del pulsante radio, consente una facile comprensione del valore controllato corretto e consente inoltre di aggiornare il valore SelectValue semplicemente cambiando il testo del pulsante radio. Nessun codice aggiuntivo è necessario quando si modifica il pulsante di opzione.

Ora si collega semplicemente la proprietà SelectedValue per tutti i pulsanti di opzione nello stesso gruppo a una proprietà stringa.

limitazioni:

  1. Due pulsanti di opzione nello stesso gruppo non possono avere lo stesso testo (ma questa è davvero una limitazione?)
  2. In fase di progettazione, i valori controllati dei pulsanti di opzione potrebbero non apparire precisi (ad esempio due pulsanti di opzione nello stesso gruppo potrebbero sembrare spuntati). Ciò non dovrebbe tuttavia verificarsi in fase di esecuzione.

Nota quando si crea un controllo personalizzato, il progetto deve essere creato prima che l’object personalizzato sia disponibile nella casella degli strumenti.

Durante la creazione di moduli è ansible trascinare elementi dal pannello “Origini dati”. Nel pannello delle fonti di dati è ansible trascinare una class o una tabella e tutti i relativi bambini nel modulo e generare automaticamente una casella di testo o in questo scenario un pulsante di opzione con un’associazione dati. Nel database o nella class dovrai fare un po ‘/ bool per ogni opzione.

Raggruppa i pulsanti di opzione e aggiungi un pulsante di opzione senza un collegamento dati per mantenere tutti i bit / bool 0.

Imposta CausesValidation su False per tutti i pulsanti di CausesValidation .

Quando si salvano le modifiche, si collegano tutti i pulsanti di opzione come:

 ((YourClass)myBindingSource.DataSource).property1 = radioButton1.Checked; ((YourClass)myBindingSource.DataSource).property2 = radioButton2.Checked; 

Penso che questa sia una copia di Come utilizzo i databinding con i pulsanti di scelta di Windows Form? E quindi, ecco una copia della mia risposta lì.