Listbox, Combobox e compagnia

giovedì 25 novembre 2004 - 15.23

Tantalo Profilo | Newbie

Ciao a tutti,
ho notevoli difficoltà a comprendere come VB.NET gestisce i vari ListBox (CheckedListBox,ComboBox, ecc.)
In particolare, data una tabella di database composta da:

chiave|NomeArticolo

riesco a stampare nella CheckedListBox tutti gli articoli letti dalla tabella grazie a CheckedListBox.Items.Add(NomeArticolo).
Non riesco però a capire come mantenere il legame anche con la chiave che è poi il riferimento che mi interessa avere quando seleziono un determinato NomeArticolo.
Qualcuno mi può dare qualche dritta ?
Grazie.

Andy Profilo | Senior Member

Ciao..nel caso di Combobox esiste una proprietà "valuemember", che dopo aver collegato con la tua table puoi settare sul campo che vorrai in output..es. nella tua tabella Chiave|NomeArticolo, puoi visualizzare i nomi articolo e avere in output dalla combobox il campo chiave, da utilizzare.

nel caso di una listview puoi creare una colonna nascosta (Size 0), e in output prendere il valore della colonna per l'elemento selezionato

listview.selecteditems(0).subitem([IndiceColonnaReturn])

A presto.

Tantalo Profilo | Newbie

Grazie per la risposta.
valuemember esiste in effetti anche per la CheckedListBox.
Tuttavia il mio problema è come collegare all' Item appena aggiunto il valuemember .

Finora quello che sono riuscito a fare è solo questo:

Public Function Manufacturers()
DBQuery.CommandText = "SELECT chiave, nome_articolo FROM articoli"
datRead = DBQuery.ExecuteReader
Do Until datRead.Read = False
Me.CheckedListBox1.Items.Add(datRead("nome_articolo"))
Loop
datRead.Close()
End Function

Potrei lavorare costruendo degli array ma non mi sembra che sia la strada migliore da percorrere.

Help!!!

Andy Profilo | Senior Member

Visto che non hai filtri ma visualizzi una tabella intera non ti conviene collegare la combobox in progettazione, con le 2 proprietà "DataSource" e "displaymember"?

In questo modo tutti i tuoi record sono inseriti automaticamente nella combo, e in ucita trovi il valore del campo impostato in "ValueMember"..

Tantalo Profilo | Newbie

Non è che potresti darmi qualche esempio di codice?
Mi va bene anche qualche link che spieghi ciò che mi dici di fare.
In ogni caso Grazie 1000

Andy Profilo | Senior Member

Per esempio, per inserire i dati nella combobox: supponendo di lavorare con la tua tabella contenente i 2 campi IdKey|CodiceArticolo, puoi crearti un data Adapter e quindi su di esso un dataset contenente la tua tabella(che io chiamo ora dataset11)

Dopodichè imposti cbbox.Datasource = dataset11.tabella
cbbox.DisplayMember = "CodiceArticolo"
cbbox.ValueMember = "IdKey"

(Queste proprietà puoi anche impostarle visivamente in progettazione, direttamente sulla combobox)

Al verificarsi dell'evento "SelectionChangeCommitted" della combo, troverai in uscita il valore del campo IdKey.

Private Sub cbbox._SelectionChangeCommitted(ByVal sender As Object, ByVal e As System.EventArgs) Handles cbbox.SelectionChangeCommitted

dim Id as string

Id = cbbox.ValueMember ' Restituisce il valore del campo Idkey x il codice articolo scelto

End Sub

Spero di averti chiarito le idee.. a presto.

Tantalo Profilo | Newbie

Ho fatto come mi hai detto:

Function articoli()
Dim da As New MySQLDataAdapter
Dim ds As New DataSet

da.SelectCommand = New MySQLCommand("SELECT chiave, articolo FROM articoli", DBConn)

ds.Clear()
da.Fill(ds, "articoli")
Me.CheckedListBox1.DataSource = ds.Tables("articoli")
Me.CheckedListBox1.DisplayMember = "articolo"
Me.CheckedListBox1.ValueMember = "chiave"
End Function

Private Sub CheckedListBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CheckedListBox1.SelectedIndexChanged
Dim Id As String
Id = CheckedListBox1.ValueMember
MessageBox.Show("Id: " + Id)
End Sub

Quando viene visualizzata la MessageBox Id è sempre uguale alla stringa "chiave" e non al valore di chiave.
Che dici mi do all'ippica ?

Andy Profilo | Senior Member

=) No, mi sbagliavo io..effettivamente andavo a memoria..poi verso il fine settimana perdo qualche colpo...

il campo dove leggi il valore non è "ValueMember", ma "SelectedValue"..

quindi :

Dim Id As String
Id = CheckedListBox1.SelectedValue
MessageBox.Show("Id: " + Id)

Prova cosi..e scusa ancora..

Ciao

Tantalo Profilo | Newbie

Dim Id As String
Id = CheckedListBox1.SelectedValue
MessageBox.Show("Id" + Id)

Ottengo il seguente errore:
Cast non valido dal tipo 'DataRowView' al tipo 'String'

ho provato a definire Id come tipo DataRowView e a fare un Ctype di Id as String, ma niente da fare di dice che è impossbile coinvertire in Stringa il tipo DataRowView.

Andy Profilo | Senior Member

Non ho mai provato con listbox, credo che tu debba specificare selectedvalue(Indice), che rappresenta l'indice della colonna interessata..sto solo supponendo, perchè ripeto, non l'ho mai fatto, ma la sintassi dovrebbe essere questa:

Id = CheckedListBox1.SelectedValue(Indx).tostring

Tantalo Profilo | Newbie

In effetti mi sa che hai ragione, occorre passare anche l'indice di riga per recuperare l'elemento.
Ho modificato la Sub in questo modo

Private Sub CheckedListBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CheckedListBox1.SelectedIndexChanged
Dim Id As String
Id = CheckedListBox1.SelectedValue(CheckedListBox1.SelectedIndex)
MessageBox.Show("Id" + Id)
End Sub
In debug vedo che effettivamente i dati ci sono, se clicco su un paio di checkbox mi restituisce qualche elemento ma poi mi dà questo errore : Indice oltre i limiti della matrice.
Mi sa che mi sto perdendo in un bicchier d'acqua.

In ogni caso grazie per il prezioso e paziente aiuto che mi hai dato.

civetta Profilo | Newbie

Scusate se scrivo qui ma non riesco a inviare nessuna richiesta di aiuto in altro modo. Vogliate perdonarmi..
Ho il seguente problema:
Tabella Nazioni su connessione A
Tabella Clienti che contiene piu nazioni su connessione A
Tabella Ordini che contiene pià clienti su connessione B
Devo recuperare tutti gli ordini che appartengono ad una determinata nazione, avevo creato una bella query sql con dei Join sulle tre tabelle (Access me la visualizza correttamente) ma nel momento di passarlo al dataadapter mi sono accorta che questo accetta una sola connessione. Qual'è la soluzione ?
Per ora ho caricato separatamente le tre tabelle nel dataset che per mia fortuna non sono molto grosse ma come faccio a filtrare il campo Nazione sugli ordini ?
La nazione è selezionata con una combobox ed è tutto il giorno che ho gli stessi problemi di questo articolo!
I dati filtrati li volevo visualizzare in un datagrid.
Grazie a tutti per l'attenzione
A proposito come faccio ad inviare una richiesta di aiuto? La pagina non mi è disponibile!

Andy Profilo | Senior Member

Ciao..innanzitutto il modo per aprire un topic tuo:

Clicca sul nome del forum dove vuoi che compaia il messaggio, poi quando vedi l'elenco dei topic clicca su "Apri un nuovo Thread", che è scritto in blu sopra la lista..

Riguardo al tuo problema io selezionerei la nazione con una combobox come fai tu, ma una volta ottenuta la nazione farei una query con un datareader, senza utilizzare l'adapter. I risultati che ottieni man mano che leggi il datareader li butti in una listview (o in un datagrid, come preferisci)..

Ciao

Tantalo Profilo | Newbie

Finalmente ci sono arrivato, la sintassi corretta è:

Id = CheckedListBox1.SelectedItem(0)

Grazie ancora per avermi aiutato

Andy Profilo | Senior Member

Bene, perfetto...

Di nulla, a presto.

civetta Profilo | Newbie

Grazie Andy ,
ho risolto il problema aggiungendo una colonna ' nazione' alla datatable degli ordini e con un ciclo for each ho aggiornato il valore della nazione. Così ho tutti i dati per filtrare gli ordini per nazione.

civetta Profilo | Newbie

Per scusarmi con Tantalo per essermi intromessa nella sua richiesta di aiuto vorrei darti questa dritta:
Se hai la necessità di associare il valore restituito dalla combobox ad una sorgente dati principale devi creare un databinding sul combobox. Per esempio tabella principale Impiegati combobox su Settori e vuoi salvare il valore del settore sul campo di Impiegati.

comboSettori.DisplayMember="Nome"
comboSettori.ValueMember="ID"
comboSettori.DataSource= settori

' collego il controllo ComboBox con la sorgente dati principale degli Impiegati
comboSettori.DataBindings.Add("SelectedValue",Impiegati,"SettoriID")

Ciao

Tantalo Profilo | Newbie

nessun problema civetta.

In effetti il nuovo problema che sto affrontando è proprio questo, impostare come selected una delle voci della mia checkedlistbox.
Ho una variabile che contiene l'ID e dovrei impostare come Selected l'item della checkedlistbox in corrispondenza del quale valuemember è = ad ID.
Il codice che mi hai inviato effettua una sorta di Join con una tabella principale, io però non ho una tabella ma un unico valore inserito dentro ID.
Spero di essere stato chiaro.
Grazie.

maximum Profilo | Newbie

una volta che ho bindato la combobox con un datatable, volessi aggiungere in testa una riga vuota come posso fare?
scusate se mi sono intromesso e grazie a tutti.
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-2025
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5