Convertire valore dataset in stringa

martedì 12 aprile 2011 - 11.59
Tag Elenco Tags  VB.NET  |  .NET 2.0  |  Windows 7  |  Visual Studio 2008  |  MySQL 5.1  |  Office 2007  |  Internet explorer 8.0  |  Chrome  |  Opera  |  Safari  |  Firefox

paky50 Profilo | Newbie

Ciao a tutti, credo di essermi perso in un bicchier d'acqua.
In pratica, ho un DB con comuni cap e provincie.
Nel mio codice ho inserito un combox relativo ai comuni che interroga il DB e visualizza al suo interno tutti comuni presenti nel DB stesso.
A questo punto vorrei in base al comune selezionato vorrei riempire in automatico, nella form, i campi CAP e Provincia. Il mio codice è il seguente:

Private Sub ComboBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBoxCom.SelectedIndexChanged
Dim ds As New DataSet
Dim query1 As String = "select cap from db_comuni.comuni where comune=" & "'" _
& ComboBoxCom.Text.Trim & "';"
M.adattatore = New MySqlDataAdapter(query1, M.connessione)
M.adattatore.Fill(ds, "comune")

TextBoxCAP.Text = ????
End Sub

la query in SQL da console mi restituisce esattamente il CAP io vorrei visualizzare nel in TextBoxCAP esattamente questo valore.
Spero di essere stato chiaro.
Grazie mille.

AntCiar Profilo | Expert

>Ciao a tutti, credo di essermi perso in un bicchier d'acqua.
>In pratica, ho un DB con comuni cap e provincie.
>Nel mio codice ho inserito un combox relativo ai comuni che interroga
>il DB e visualizza al suo interno tutti comuni presenti nel DB
>stesso.
>A questo punto vorrei in base al comune selezionato vorrei riempire
>in automatico, nella form, i campi CAP e Provincia. Il mio codice
>è il seguente:
>
>Private Sub ComboBox1_SelectedIndexChanged(ByVal sender As System.Object,
>ByVal e As System.EventArgs) Handles ComboBoxCom.SelectedIndexChanged
> Dim ds As New DataSet
>Dim query1 As String = "select cap from db_comuni.comuni where
>comune=" & "'" _
> & ComboBoxCom.Text.Trim & "';"
>M.adattatore = New MySqlDataAdapter(query1, M.connessione)
> M.adattatore.Fill(ds, "comune")
>
> TextBoxCAP.Text = ????
> End Sub
>
>la query in SQL da console mi restituisce esattamente il CAP
>io vorrei visualizzare nel in TextBoxCAP esattamente questo valore.
>Spero di essere stato chiaro.
>Grazie mille.


Ciao. Ti conviene fare in un altro modo. Dove carichi i nomi dei comuni nella combo, utilizza quanto segue in modo da associare alla combo una tabella contenente tutti i campi che a te servono (IDComune, NomeComune, provincia, Cap etc...)

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

poi nel tuo evento di SelectIndexChange basta fare questo

TextBoxCAP.Text = cstr("" & CType(me.ComboComune.DataSource, DataTable).Rows(Me.ComboComune.SelectIndex)("cap"))
TextBoxProvincia.Text = cstr("" & CType(me.ComboComune.DataSource, DataTable).Rows(Me.ComboComune.SelectIndex)("NomeCampoDellaProvincia"))


In questo modo fai un unico accesso al db e risolvi il tuo problema.
PS. Il codice l'ho scritto di pugno quindi può darsi che ci siano errori di sintassi.

Ciao ciao

Cristian Barca

paky50 Profilo | Newbie

Grazie per la celerità.
Forse
me.ComboBoxCom.datasource = ds. comune
è lo stesso di

me.ComboBoxComune.datasource() = ds.tables("comune")


perchè altrimenti mi dà errore, poi

me.ComboComune.DisplayMember = "DESC"

DESC si riferisce all' ordinamento?

Grazie.

paky50 Profilo | Newbie

Allora nella form_load ho inserito il seguente codice:

Dim queryComune As String = " select * from db_comuni.comuni;" M.connessione.Open() M.adattatore = New MySqlDataAdapter(queryComune, connessione) M.adattatore.Fill(ds, "comune") Me.ComboBoxCom.DataSource = ds.Tables("comune") Me.ComboBoxCom.DisplayMember = "comune"

mentre nelle evento SelectedIndexChanged ques'altro:

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

e funziona alla grande.
GRAZIE.

Solo due cose però
1. Siccome della seconda parte del codice non ho capito un granchè mi dici quale argomento dovrei approfondire. Non amo copiare il codice senza capirci nulla.
2. Se nella ComboBox scrivo il comune per intero e passo all'altro campo con TAB il CAP non cambia mentre se clicco con il mouse si.
Si può ovviare?

Grazie ancora.

AntCiar Profilo | Expert

>Grazie per la celerità.
>Forse
>me.ComboBoxCom.datasource = ds. comune
>è lo stesso di
>
>me.ComboBoxComune.datasource() = ds.tables("comune")
>
>perchè altrimenti mi dà errore, poi

si sono entrambe la stessa cosa. Nella prima c'è solo uno spazio che va tolto ( ds.comune al posto di ds. comune)

>
>me.ComboComune.DisplayMember = "DESC"
>
>DESC si riferisce all' ordinamento?
>
>Grazie.

No. Con DESC volevo riferimi al campo del nome del comune (utilizzo DESC come abbreviazione di Descrizione). Siccome non sapevo come si chiama il campo nel tuo database avevo utilizzato questo acronimo. Comunque al posto di DESC ci va il nome del campo che rappresenta il nome del comune.

Se valorizzi sia il DisplayMemeber sia il ValueMember con lo stesso nome di campo (ad esempio quello del nome del comune), quando andrai a fare ComboComune.SelectedValue ti restituirà la stringa con il nome. Se poi nella tua tabella hai anche un campo IDComune e lo associ al ValueMember, mentre il DisplayMember ci associ il nome del comune, a video vedrai sempre il nome del comune però quando accederai alla proprietà SelectedValue ti verrà restituito l'IDComune.
Cristian Barca

AntCiar Profilo | Expert

Ho risposto prima che arrivasse questo messaggio.

>TextBoxCAP.Text = CStr("" & CType(Me.ComboBoxCom.DataSource,
>DataTable).Rows(Me.ComboBoxCom.SelectedIndex)("cap"))

Allora la cosa funziona così: nella prima parte di codice hai associato il datasource alla combo. Nel tuo caso hai associato un dataTable alla comboBox. La proprietà DataSource della combo è di tipo Object, quindi può ricevere qualsiasi cosa (Datatable, DataView)

Ora quando fai il discorso al contrario, cioè accedere all'oggetto che hai passato al datasource, devi in qualche modo dirgli di che tipo è.
con Ctype(Me.ComboBoxCom.DataSource, DataTable) non fai altro che dire "converti l'oggetto associato a 'Me.ComboBoxCom.DataSource' in un DataTable).

l'oggetto dataTable ha al suo interno delle righe. Con '.Rows' accedi ad una riga del datatable e con precisione alla riga nella posizione selezionata dalla combo (Me.ComboBoxCom.SelectedIndex).

Una volta che stai sulla riga accedi alla colonna specifica ("cap")

Poi il Cstr("" & ....................) non fa altro che convertire il tutto in stringa. Infatti quando accedi ad un determinato valore all'interno di un datatable nella posizione Riga x Colonna, ti viene restituito un tipo Object e quindi siccome tu lo dovevi associare alla proprietà Texr che è di tipo stringa, devi fare la conversione.

spero sia chiaro.

ciao ciao

Cristian Barca

paky50 Profilo | Newbie

...Ora è davvero tutto chiaro.
Grazie mille.

Pasquale Marcellini

paky50 Profilo | Newbie

Riprendo velocemente il post solo per un ulteriore chiarimento sullo stesso.
Se volessi azzerare il comboBox dopo il click su un bottone come posso fare?
Avevo provato utilizzando il codice:

ComboBox1.Items.Clear()

ma mi dà problemi poiche è impostata la proprietà DatoSource.
Esiste un metodo alternativo?
Grazie.

AntCiar Profilo | Expert

ciao.

ComboBox1.DataSource = nothing
Cristian Barca

paky50 Profilo | Newbie

Avevo provato ma poichè in base al valore del comboBox riempio anche altri campi in particolare il seguente:

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

se faccio

comboBoxR.dataSource = nothing

mi dà errore. Cosa che non succede per i comboBox non associati ad altri textbox.
Grazie.

AntCiar Profilo | Expert

Ciao. E' normalissimo che va in errore.

quando ho letto 'Se volessi azzerare il comboBox dopo il click su un bottone come posso fare?' avevo ipotizzato che tu volevi togliere l'associazione alla comboBox (cioè svuotarla del tutto). se è quello che effettivamente vuoi, allora nella parte di codice dove valorizzi il CAP nella textBox, inserisci la tua istruzione nel seguente blocco di codice così non andrà in errore:

if me.ComboBox1.DataSource is nothing = false
me.textBoxCap.Text = ........................ (il codice che già usi)
else
me.textBoxCap.Text = ""
end if

poi se per 'azzerare' intendi NON SVUOTARE LA COMBO ma farla posizionare su una riga vuota, allora devi fare in questo modo:
Dopo aver caricato la tabella comuni, ci aggiungi a mano una riga con tutte le descrizioni vuote e come IdComune ci dai per esempio -1
poi quando devi azzerare fai Me.ComboBox1.SelectedValue = -1
Cristian Barca

paky50 Profilo | Newbie

La seconda soluzione è quella che cercavo, effettivamente a me serve la visualizzazione del combobox vuoto, non mi serve "svuotare" lo stesso.
Grazie ancora.
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