C # – Come faccio a ritornare separatamente i valori int da ciascuna GroupBox radio?

Mi permetta di chiarire la mia situazione e di avvicinarmi.

Ho un file excel con 10 colonne. Le prime cinque colonne hanno dati che formano le condizioni per la query, mentre le ultime cinque colonne contengono dati che formano il risultato.

Sto provando a fare un software con questi dati in un database o excel (se il database è difficile) where le prime cinque colonne verranno collegate ad un elenco o al menu o attualmente RadioButtons in cinque diversi gruppi. Quando vengono selezionate le selezioni e premuto il button SUBMIT, il risultato verrà visualizzato come cinque dati dalle righe corrispondenti nell'eccellenza o nel database.

Questo è ciò che sto cercando di realizzare.

Si prega di commentare se il mio approccio è sbagliato. Grazie in anticipo a tutti i posti.

————————– Domanda Originale ———————- ——

Ho 5 groupboxes (1 ha 5 radiobuttons, 2 ha 3, 3 e 4 ha 11, e 5 ha 4) su un WPF. Sulla base del quale radiobutton è selezionato da each groupBox, il software dovrebbe fornire quattro parametri di output (da un CSV o da un database)

Ho usato Come ottengo il button di opzione selezionato da una casella di gruppo? il codice da quello dato da Re Re, e lo ha modificato per usare per il mio scopo.

var checkedRadio = new []{groupBox1, groupBox2, groupBox3, groupBox4, groupBox5}.SelectMany(g=>g.Controls.OfType<RadioButton>().Where(r=>r.Checked)); foreach(var c in checkedRadio) MessageBox.Show(c.Name); 

Quello che mi dà è il radiobuttons selezionato uno dopo l'altro come casella di messaggio.

Voglio ringraziare il re Re e molti altri (più di 20) le cui risposte per varie risposte mi hanno aiutato a raggiungere questo punto.

Dove sono bloccato è come utilizzare il loop foreach per assegnare i valori a cinque int separati e poi utilizzarlo per calcolare un valore int finale che posso assegnare a vari risultati che voglio mostrare.

Ho cercato di assegnare valori a int in each gestore di events CheckedChanged, ma tutti sono vuoti privati ​​e non restituiscono nulla. Ho cercato di cambiarli per tornare indietro, ma non riesco a far scappare quel dado.

Sono sicuro che tutto il mio approccio potrebbe essere sbagliato qui, ma non ho molto idea in questo.

// quello che voglio fondamentalmente è dare opzioni in g = cinque gruppi e basandosi su selezioni da questi cinque gruppi (colonne in un excel), visualizza i risultati di 4 colonne corrispondenti nella row corrispondente in un database. Il mio approccio attuale sopra è una soluzione perchè non ho conoscenza del lavoro con i database.

Penso che dovresti ignorare l' assegnazione di valori a cinque int separati , ma calcolare il valore risultante. Ad esempio, codifichiamo il groupBox s da bit e calcoliamo una maschera bit

  groupBox1 - 00001 (let it be checked) groupBox2 - 00010 groupBox3 - 00100 (let it be checked) groupBox4 - 01000 (let it be checked) groupBox5 - 10000 ----------------- mask 01101 (13) 

quindi se vengono selezionati groupBox1 , groupBox3 e groupBox4 la maschera finale sarà 01101

 var result = new [] {groupBox1, groupBox2, groupBox3, groupBox4, groupBox5} .Select((box, index) => new { box = box, mask = 1 << index }) .Where(item => item.box.Controls .OfType<RadioButton>() .Any(button => button.Checked)) .Sum(item => item.mask); 

Nel caso in cui è necessario utilizzare pesi arbitrari, organizzarli in una collezione ad es

  double[] weights = new double[] {1.2, 3.58, 4.62, -1.7, 0.9}; double result = new [] {groupBox1, groupBox2, groupBox3, groupBox4, groupBox5} .Select((box, index) => new { box = box, weight = weights[index] } .Where(item => item.box.Controls .OfType<RadioButton>() .Any(button => button.Checked)) .Sum(item => item.weight); 

Il principio guida rimane lo stesso: non utilizzare valori separati : poiché si dispone di una raccolta per i controlli (groupboxes), inserire anche i valori corrispondenti in una raccolta

Mi dispiace ma è brutto avere collezioni separate. È necessario eseguire un controllo utente in base alla casella di controllo che ha l'int o utilizzare il tag del controllo. Potresti avere la casella di gruppo come un controllo che estrae i calcoli sulla forma, ma dipende da ciò che fai con loro.

 public class MyClass : CheckBox { public int MyValue { get; set; } public MyClass() { } } 

O semplicemente usare:

 value = (int)myCheckBox.Tag;