|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Sep 2004
Messaggi: 3967
|
[C#]popolamento controlli visuali
Ciao a tutti
Ho questo piccolo problema: ho un oggetto combobox che ha un'origine dati. Supposto di avere una tabella: table(id, descrizione) non ho problemi a popolare il combo con tutti i valori contenuti nel campo descrizione. Quello che invece non riesco a capire è come popolare un altro elemento sulla base del valore contenuto nel combo; per esempio, se volessi una casella di testo che mi contiene l'id relativo al valore 'descrizione', dovrei fare un'altra select e popolare poi la casella di testo. Questo ragionamento ha però secondo me un difetto di base: se ho due valori nel campo 'descrizione' uguali, non ha senso fare una select perchè non sarei certo di aver scelto la 'descrizione' giusta. Per essere più chiaro: Codice:
tabellaProva: id - - descrizione 1 - - verde 2 - - rosso 3 - - verde Codice:
verde rosso verde Grazie mille RaouL.
__________________
Dai wafer di silicio nasce: LoHacker... il primo biscotto Geek
|
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
Vedi un po' se ti aiuta
Codice:
namespace ComboStudy
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
PopCombo();
}
public void PopCombo()
{
comboBox1.Items.Clear();
comboBox1.Items.Add(new BusinessObject(10, "Verde"));
comboBox1.Items.Add(new BusinessObject(20, "Rosso"));
comboBox1.Items.Add(new BusinessObject(30, "Verde"));
}
private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
BusinessObject bo = comboBox1.SelectedItem as BusinessObject;
if (bo != null)
{
string str=string.Format("Indice {0} - ID {1}, STR {2}",comboBox1.SelectedIndex,bo.ID,bo.str);
MessageBox.Show(str);
}
}
}
public class BusinessObject
{
public int ID;
public string str;
public BusinessObject(int p_id, string p_str)
{
ID = p_id;
str = p_str;
}
public override string ToString()
{
return str;
}
}
}
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Sep 2004
Messaggi: 3967
|
Ho fatto un piccolo passo avanti mediante l'uso di un dizionario e aggiungendo un altro combobox al posto della textbox:
Codice:
//ottengo i dati dalla select, li carico nel dizionario e poi nel form:
foreach(KeyValuePair<int, string> k in classeProva.GetDizionario())
{
comboKey.Items.Add(k.Key);
comboColore.Items.Add(k.Value.ToString());
}
Benone, ora ho tutti i dati che mi servono ma.... devo capire ancora questo: se scelgo un colore diverso in comboColore, mi deve variare anche il corrispondente in comboKey. RaouL. Piccolo Edit: Non avevo visto ancora il tuo suggerimento
__________________
Dai wafer di silicio nasce: LoHacker... il primo biscotto Geek
Ultima modifica di RaouL_BennetH : 25-11-2008 alle 17:19. |
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Sep 2004
Messaggi: 3967
|
Ho risolto in modo credo non proprio brillante:
Mi sono detto, dato che quando popolo le combo con i valori del dizionario, gli index sono allineati, quindi, se cambio l'index sul primo combo, posso prenderne la posizione ed assegnare la stessa sul secondo combo. Cioè: Codice:
private void comboColore_SelectedIndexChanged(object sender, EventArgs e)
{
comboKey.SelectedIndex = comboColore.SelectedIndex;
}
RaouL.
__________________
Dai wafer di silicio nasce: LoHacker... il primo biscotto Geek
|
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
Allora non ho capito.
Comunque la soluzione e' (quasi) sempre popolare la combo direttamente con gli oggetti che si vogliono rappresentare, non con solo la loro rappresentazione (che appunto e' senza chiave)
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
|
|
|
|
|
#6 | |
|
Senior Member
Iscritto dal: Sep 2004
Messaggi: 3967
|
Quote:
Scusami gugoXX, non credo di aver capito bene; in sostanza dici che non è molto corretto popolare solo con i "records" ottenuti dall'origine dati ? Grazie mille RaouL.
__________________
Dai wafer di silicio nasce: LoHacker... il primo biscotto Geek
|
|
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
No, anzi, l'opposto.
E' opportuno popolare le combo (e altri controlli) proprio con i record ottenuti dal database, e non solo una descrizione. Dove ciascun record avra' chiave, descrizione e tutto il resto. In questo modo quando selezionerai l'elemento saprai tutto di esso, descrizione e chiave compresi. Sulla base della chiave quindi potrai agire su altri elementi, lanciare altre query, etc. Prima avevo postato un esempio, forse l'avevi perso.
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
|
|
|
|
|
#8 | |
|
Senior Member
Iscritto dal: Sep 2004
Messaggi: 3967
|
Quote:
Eh si, ho messo un edit perchè l'ho notato solo dopo
__________________
Dai wafer di silicio nasce: LoHacker... il primo biscotto Geek
|
|
|
|
|
|
|
#9 | |
|
Bannato
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
|
Quote:
una domanda: con la API è possibile associare un puntatore a ogni voce di una listbox(o combobox) tramite le funzioni GetItemDataPtr/SetItemDataPtr. Il puntatore può puntare a dati semplici, come int, o a dati più complessi, come una struct. Non esiste, in C#, qualcosa di simile?
|
|
|
|
|
|
|
#10 |
|
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
Certo.
Se vedi nel mio esempio, la combobox ha una proprieta' Items che sono gli oggetti contenuti nella combobox. La combobox mostrera' il risultato della ToString() di ciascuno di questi elementi. Ma ogni elemento puo' essere del tipo che si vuole. Tutti gli oggetti hanno un-implementazione di base della ToString(), anche se e' bene effettuarne l'override, proprio per permettere il popolamento con una stringa custom. Items implementa l'interfaccia IEnumerable, e come tale la si puo' trattare, con Add, Remove, foreach, Clear, etc. Quindi, quando si aggiunge un'istanza di una classe (che e' per riferimento in C), di fatto si aggiunge solo il puntatore ad Items. Quandi si aggiunge invece una struttura o un tipo Value base, di fatto si aggiunge una nuova copia ad Items. Sotto la coperta viene creato al volo un oggetto il cui puntatore viene aggiunto ad Items. (A differenza del C++ pero' la distruzione di quest'oggetto creato al volo verra' demandata al Garbage Collecor, una volta che l'oggetto verra' scodato da Items)
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. Ultima modifica di gugoXX : 25-11-2008 alle 19:59. |
|
|
|
|
|
#11 |
|
Bannato
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
|
Grazie mille
Approfitto per precisare che ricordavo male. La funzioni di cui parlavo sono implementate su MFC. Per la API bisogna utilizzare i messaggi CB_GETITEMDATA/CB_SETITEMDATA o le macro ComboBox_GetItemData/ComboBox_SetItemData.
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 21:10.




















