Combobox lato progettazione: displaymember e valuemember non vanno

mercoledì 10 febbraio 2010 - 18.13

Klaus-zanini Profilo | Senior Member

Ciao a tutti
ho creato una windows form che legge i dati da un dataset e me li mostra. Alcuni dati dovrei gestirli con combobox visualizzando una descrizione ma memorizzando (in fase di salvataggio) un codice.
Pertanto ho scelto di trasformare il campo da textbox a combobox e con il drag&drop l'ho posizionato sulla form.
Poi sulle proprietà ho scelto come datasource un dataset creato apposta sulla tabella contenente codici e descrizioni del campo ed infine ho messo il campo descrizione come DisplayMember e il campo codice come ValueMember.
Il risultato all'apertura della form è:

1. valore visualizzato codice
2. se apro la combobox mi appare l'elenco di tutte le descrizioni
3. se ne scelgo mi mostra la descrizione ma rimane tutto bloccato (non posso spostarmi su un altro controllo, non posso chiudere la form a meno di scrivere a mano un numero sulla combobox).

Cosa sbaglio?

freeteo Profilo | Guru

Ciao,
solitamente quando rimani bloccato su un controllo è qualcosa dovuto al tipo di dato a cui sei bindato che non va bene...ad esempio l'oggetto sottostante (nel tuo caso la riga del DataTable con la colonna che hai bindato) vuole un numerico ma tu gli hai agganciato una stringa...o cose di questo genere.

Verifica cosa hai bindato a livello di maschera proprietà->Databinding->Advanced->[...]

Ciao.

Matteo Raumer
[MCAD .net, MVP Visual C#]
http://blogs.dotnethell.it/freeteo

Klaus-zanini Profilo | Senior Member

Ora ho visto. Era segnato solo il binding per Text e non quello per selectedValue.

Ma che tu sappia c'è qualche articolo che spiega come usare il binding per creare form di tipo testa-righe? Col fai-da-te ho fatto un sacco di prove e ho scritto codice che secondo me è superfluo...
In altre parole ho 2 tabelle testa ordine e righe ordine (campo IdOrdine chiave univoca di testa e idOrdine+IdRiga chiave di righe).
Il mio obiettivo sarebbe quello di mettere alcuni campi della testa compilabili nella form e una datagridview delle righe associate in modo da poter navigare, modificare, inserire e cancellare dati.

Penso sia una banalità sapendo usare correttamente i vari oggetti, ma non ho trovato info in merito...hai qualche riferimento?

freeteo Profilo | Guru

Ciao,
ti consiglio di partire da msdn, e magari se riesci affiancare qualche libro che solitamente sono dettagliati.
Ti lascio qualche link che mi sembra valido:
http://msdn.microsoft.com/en-us/library/aa984462(VS.71).aspx
http://msdn.microsoft.com/en-us/library/c12c1kx4.aspx
http://msdn.microsoft.com/en-us/library/ms973824.aspx
http://windowsclient.net/blogs/faqs/archive/2006/05/30/how-do-i-bind-two-datagrids-in-a-master-detail-relationship.aspx
http://www.akadia.com/services/dotnet_databinding.html

http://www.microsoft.com/downloads/details.aspx?familyid=08E3D5F8-033D-420B-A3B1-3074505C03F3&displaylang=en
questo ha una serie di esempi, tra i quali se non ricordo male,alcuni proprio relativi a master-details


Ciao.

Matteo Raumer
[MCAD .net, MVP Visual C#]
http://blogs.dotnethell.it/freeteo

Klaus-zanini Profilo | Senior Member

Grazie me li studio e spero di riuscire a venirne fuori.

Ancora grazie per l'aiuto.

freeteo Profilo | Guru

>Grazie me li studio e spero di riuscire a venirne fuori.
>Ancora grazie per l'aiuto.
figurati siamo qui per questo...cmq la cosa è semplice quando capisci il concetto e prendi dimestichezza con le DataSource.

ps: io ti consiglierei di ragionare su oggetti, e non su datatable e dataset, che poi ti complichi la vita, ossia ti puoi fare delle classi con delle proprietà che saranno poi i tuoi oggetti (es: Cliente, Ordine,RigaOrdine etc...) e poi bindi quelli...cmq intanto prendi pratica poi magari ne riparliamo.

Ciao.

Matteo Raumer
[MCAD .net, MVP Visual C#]
http://blogs.dotnethell.it/freeteo

Bazzi Profilo | Junior Member

Ciao,

stavo leggendo questo thread dato che avevo anch'io alcune questioni da risolvere con i combo.
Sapresti dirmi dove posso vedere qualche esempio di binding sugli oggetti anzichè dataset/datatable ?
Mi sembra una cosa molto interessante...

Ciao.

PS:Scusate l'intrusione...
The Bazz

Klaus-zanini Profilo | Senior Member

Ciao,
vedi qui se può aiutarti...

http://www.akadia.com/services/dotnet_databinding.html

freeteo Profilo | Guru

Ciao,
aggiungo anche questo:
http://www.codeproject.com/KB/grid/BindSourceBindingNavCS.aspx

dove l'unica differenza è che non nella finestra della datasource, non scegli il db, ma scegli "Object", così facendo lo step successivo di questo wizard è scegliere la classe che vuoi bindare.
Poi da codice ti basta impostare la DataSource al BindingNavigator che hai nella maschera da codice (tipicamente una tua classe dello strato di Business che ti torna una IEnumerable<T>...) e tutto si comporta come sempre.

Quindi riepilogando, attaccarsi al db direttamente (tramite dataset poi creato in automatico da vs), o ad un webservice o dire al bindingsource che gli arriveranno degli oggetti di quel tipo (classe del tuo progetto) è lo stesso.

Io propendo quasi sempre, anche per i progetti semplici, per quest'ultimo caso, perchè sono abituato a lavorare a layer, ma chiaramente sono scelte personali...

Ciao.

Matteo Raumer
[MCAD .net, MVP Visual C#]
http://blogs.dotnethell.it/freeteo
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2017
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5