Combobox, database e array

giovedì 24 settembre 2009 - 21.28

disti1 Profilo | Newbie

Buondì a tutti,

ho cercato su Internet e su questo stesso forum informazioni sul databinding di combobox, ma da nessuna parte sembra essere affrontato lo specifico problema che ho io.

La cosa è semplice: ho una tabella tipo:

VIAGGI
-----------
IDViaggio(PK)
Destinazione
DataPartenza
Mezzo

dove Tipo è un numero che corrisponde a

0 - bus
1 - aereo
2 - nave
3 - treno

Queste informazioni sono riportate in altrettante TextBox collegate al DataSet tramite BindingSource. Tutto funziona bene, riesco a modificare i valori e a salvarli.

Il problema ce l'ho con il campo "Mezzo", perchè ovviamente viene riportato il numero presente nel database, mentre io vorrei proporre all'utente le relative descrizioni.

Per questo sto facendo delle prove con una ComboBox, ma non riesco a fare il binding.

Nel codice ho provato a creare una struttura come questa:

Public Structure sMezzo Private _codice As Integer Private _descrizione As String Public Property Codice() As Integer Get Return _codice End Get Set(ByVal value As Integer) _codice = value End Set End Property Public Property Descrizione() As String Get Return _descrizione End Get Set(ByVal value As String) _descrizione = value End Set End Property End Structure

che inizializzo in Form_Load così:

Public Mezzi As sMezzo ... Private Sub Form1_Load(.....) ... Mezzi = New sMezzo() {New sMezzo With {.Codice = 0, .Descrizione = "Bus"}, _ New sMezzo With {.codice = 1, .descrizione = "Aereo"}, _ New sMezzo With {.codice = 2, .descrizione = "Nave"}, _ New sMezzo With {.codice = 3, .descrizione = "Treno"} _ } ComboBox1.DataSource = Mezzi ComboBox1.DisplayMember = "descrizione" ComboBox1.ValueMember = "codice"

In questo modo nella combo vengono visualizzate le scelte corrette, e viene correttamente restituito il "numero" corrispondente alla scelta effettuata, ma non riesco a capire come fare a collegarlo al dataset: a far sì, in altre parole, che quando carico una riga dalla tabella venga selezionato il valore corretto della combo, che poi può essere modificato e salvato.

In effetti in tutto ciò che ho letto sull'argomento non viene presa in considerazione la possibilità di avere un'origine dati per l'elenco visualizzato (l'array creato nel codice) e una per il valore da selezionare (il campo del database).

Mi date una mano?

Grazie a tutti!! Ciao!

Roberto

slavishdany Profilo | Newbie

ciao io ho avuto lo stesso problema, ma l'ho risolto in tutt'altro modo,
ho creato un ciclo di lettura del db con un datareader, ho caricato i dati del datareader nella combobox e poi nell'evento textchanged della combobox gli cambio la query che mi fa comparire i dati nel gridview.
Ora non ho il codice sotto mano ma a grandi linee lo ricordo..ora te ne posto un pezzo...appena recupero il vecchio codice te lo posto completo

evento form load
dim strleg as string=""
dim cont as integer=0
while datareader.read
cont=datareader.getordinal("mezzo")
strleg=strleg & datareader.getvalue(cont) & vbclrf
end while
datareader.dispose
me.combobox1.items.add(strleg)
end sub

con questa parte di codice inserisci tutti i mezzi nella combobx.
Appena riesco a riaprire il visual studio ti metto anche il codice per far cambiare origine dei dati al grid view.

io ho usato vb.net con le libs oleDB, però la stessa cosa puoi fara con le libs MySQL, SQLServer, e tutti i tipi di DB
Spero di esserti stato utile


disti Profilo | Newbie

Ciao slavishdany,

ti ringrazio per l'aiuto.

Ho risolto il problema utilizzando, come volevo, il databinding. In pratica ho semplicemente dovuto aggiungere la seguente riga in fondo al Form_Load che ho postato prima:

ComboBox1.DataBindings.Add("SelectedIndex", ViaggioBindingSource, "Mezzo")

In realtà questa soluzione non utilizza il campo "Codice"della struttura, ma si limita a prendere l'elemento con indice corrispondente, ma per il momento va bene così. Adesso vedo se riesco a studiare qualcosa di più raffinato.

ciao, grazie!!

disti Profilo | Newbie

Ho risolto definitivamente, modificando la riga

ComboBox1.DataBindings.Add("SelectedIndex", ViaggioBindingSource, "Mezzo")

in

ComboBox1.DataBindings.Add("SelectedValue", ViaggioBindingSource, "Mezzo")

Questo è interessante:
avevo già provato questo approccio, ma non funzionava: infatti, caricando i dati nel dataset, mentre nelle textbox venivano visualizzati i valori corrispondenti al record selezionato, nella combobox veniva visualizzato un valore nullo.
Ho impiegato parecchio tempo per cercare la soluzione, poi ho scoperto che qualcuno l'aveva già trovata:

http://stackoverflow.com/questions/420998/binding-a-combobox-to-an-ilist-and-using-selectedvalue

Il problema è che nella mia tabella il campo "Mezzo" è di tipo "tinyint", che viene mappato in VB.NET come Byte.

Nella struttura sMezzi che ho creato, invece, il campo Codice è di tipo Integer. Per qualche motivo questa cosa non piace a VB.NET, e sono d'accordo con Jan (autore del post linkato sopra) che piuttosto dovrebbe essere generata una eccezione, non un valore nullo.

Comunque, l'importante è saperlo!

ciao!
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-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5