Rload combobox

lunedì 18 maggio 2009 - 23.44

netgit Profilo | Newbie

Ho un combobox così creato :
Dim strSQL As String
strSQL = "select id as id,denom1 as iddescr from CUSTOMERS where customer='" & customerTBO.Text & "';"
Dim strConn As String = Me.SQLConnString.ToString
Dim daLookups As New SqlDataAdapter(strSQL, strConn)
Try
daLookups.Fill(dsLookups)
With dsLookups
.Tables(0).TableName = "CustStorageLookup"
End With
Catch excFill As Exception
MsgBox(excFill.Message + excFill.StackTrace, , "Error Filling Lookup Tables")
Finally
If daLookups.SelectCommand.Connection.State = ConnectionState.Open Then
daLookups.SelectCommand.Connection.Close()
End If
End Try
'Customer storage
With dest_dep_idCBO
.DataSource = dsLookups.Tables("CustStorageLookup")
.DisplayMember = "IDdescr"
.ValueMember = "ID"
.DataBindings.Add(New Binding("SelectedValue", CustomersBindingSource, "dest_dep_id", True))
End With

al cambiare della customerTBO.Text devo aggiornare la sua tabella del dataset.
Se aggiorno il datatable la combo no riflette il cambiamento, se ricreo il dataset e riassocio il datasource la comboi riflette i cambiamenti ma si posiziona sulla prima voce e quindi la form che contiene il tutto o meglio il suo dataset lo rileva come cambiamento ( haschanges = true )

Io voglio solo aggiornare il contenuto della lista della combo senza alterare il contenuto del dato bindato.

Qualcuna so dove sbalio ?

Ciao a tutti e grazie

Jeremy Profilo | Guru

Ciao Andrea.
Potresti aggiornare/ricaricare il DataTable ogni qualvolta apporti una modifica nel database ma, assegnare il datatable al DataSource del combobox, solo quando effettivamente ti serve, quindi ...... nell'evento DroDown del Combobox.

Facci sapere..
Ciao

netgit Profilo | Newbie

Mi dovrai scusare ma non comprendo la tua risposta.
Perchè se faccio solamente uf fill del dataset sulla tabella associata al datasource della combo le righe della combo non cambiano?
Ciao e grazie dell'attenzione

Jeremy Profilo | Guru

Ciao Andrea.
Dopo aver rieseguito il fill per ripopolare il datatable ..... nell'evento DropDown della combo mettici questo codice:

private sub RipopolaCombobox() handles tuacombobox.dropdown tuacombobox.datasource=tuodataset.tables("TuaTabella") tuacombobox.displaymember="CampoDaVisualizzare" end sub


Facci sapere...
Ciao

netgit Profilo | Newbie

Io penso di aver risolto così:

miacombo.BindingContext(miacombo.DataSource).SuspendBinding() miacombo.datasource(dataset.tables("nome_tabella") miacombo.BindingContext(miacombo.DataSource).ResumeBinding()

Che differenza c'è fra la tua soluzione e quella che ho trovato io da internet?

ciao

netgit Profilo | Newbie

Avrei anche un'altra domanda sempre inerente :
io pensavo bastasse fare un refill del datatable perchè avevo notato che usando lo stesso datasource per due combo sulla stessa form, i cambiamenti di selezione dell'uno si riflettevano sull'altro, quindi che esistesse un legame attivo fra il datasource ed il contenuto mostrato dalla combo.
Per ovviare a ciò devo avere datatable identici ma con nomi diversi per associarli ad ogni combo.
L'esempio è la scheda tecnica del prodotto, in cui devo creare tre combo che mostrano l'unità di misura di vendita/acquisto/stock e mi sembra stupido avere tre oggetti in memoria esattamente identici!!!
Allora vuol dire che assegnado il datatable come datasource genera un vettore di elementi che accoda alla combo e lo stesso vettore lo condivide fra tutte le combo che hanno lo stesso datasource ?

?!?!?!?

Jeremy Profilo | Guru

Ciao Andrea.
Mi dispiace ..... ma non ho capito bene la domanda!!
Puoi spiegarti meglio???

Facci sapere...
Ciao

netgit Profilo | Newbie

Su una form ho due combo :
'sell_tu_id
With sell_tu_idCBO
.DataSource = dsLookups.Tables("TUsellLookup")
.DisplayMember = "IDdescr"
.ValueMember = "ID"
.DataBindings.Add(New Binding("SelectedValue", ItemsBindingSource, "sell_tu_id", True))
End With
'purchase_tu_id
With purchase_tu_idCBO
.DataSource = dsLookups.Tables("TUsellLookup")
.DisplayMember = "IDdescr"
.ValueMember = "ID"
.DataBindings.Add(New Binding("SelectedValue", ItemsBindingSource, "purchase_tu_id", True))
End With

Se gli faccio condividere il datatable , al click su uno dei due cambia il valore mostrato anche dell'altro.
Quindi il combo sembrerebbe puntare direttamente al datatable indicato dalla proprietà datasource.
Ma se aggiorno il datatable con un nuovo fill no !
Che senso/utilità ha allora?
Mi viene da pensare che questo datatable viene caricato nelle righe della combo epoi condiviso come array con altri combo con datasource uguale.
Oppure : il contenuto dei valori mostrati all'evento dropdown da dove .... arriva ?
?????????

Jeremy Profilo | Guru

Ciao Andrea.
Attenzione!!
Siamo al punto di partenza....voglio dire...per aggiornare gli elementi della seconda ComboBox devi fare, quanto meno,la stessa cosa che hai fatto per la prima ComboBox(anche se mi sembra un pò troppo macchinosa).
Alla proprietà DataSource dei due combobox,è vero che assegni lo stesso DataTable, ma è anche vero che il binding alla proprietà SelectedValue, lo fai riferito ad un BindingSource(ItemsBindingSource) e non alla DataTable.
Prova a sostituire ItemsBindingSource con dsLookups.Tables("TUsellLookup") ...... oppure assegnare al DataSource dei 2 combobox l'oggetto ItemsBindingSource.

Facci sapere...
Ciao

netgit Profilo | Newbie

Scusa ma o mi spiego male o non comprendo ciò che gentilmente cerchi di spiegarmi.
Premesso che metto sicuramente in dubbio ogni mia tecnica, le fasi necessarie all'impostazione della mia combo sono :
- dove reperire le righe da mostrare al dropdown
- di questo elenco di valori quale colonna mostrare
- di questo elenco di valori quale colonna salvare
- dove salvare e quindi in quale campo del DB

nello stesso ordine con cui le ho elencate prima in VB le traduco:

-purchase_tu_idCBO.DataSource = dsLookups.Tables("TUsellLookup")
-purchase_tu_idCBO.DisplayMember = "IDdescr"
-purchase_tu_idCBO.ValueMember = "ID"
-purchase_tu_idCBO.DataBindings.Add(New Binding("SelectedValue", ItemsBindingSource, "purchase_tu_id", True))

Questo è il metodo che ho imparato a preparare una combo per come serve alle mie necessità.

Quindi se devo impostare due combo che però salvano il loro dato ("ID") in due campi diversi del DB, replicherei la stessa cosa variando solo:
- il nome del campo del DB,
Essendo i campi sulla stessa tabella del DB non altero "ItemsBindingSource" e tantomeno il datasource dovendo le combo mostrare dati uguali, MA NON LA STESSA SELEZIONE.
L'argomento è la trade unit di vendita e quella d'acquisto ( o unità di misura ) e quindi devo poter impostare una selezione diversa per ogni combo e questo risco a farlo solo se il datasource ha un datatable di nome diverso ( quindi faccio un fill due volte su datatable con nomi diversi ma contenuto UGUALE )

C'è un modo diverso per avere due combo con tali requisiti ?
Ciao e grazie

Jeremy Profilo | Guru

Ciao Andrea.
Giuro che faccio una fatica immensa a capirti....ma probabilmente è colpa mia e del caldo.
Proviamo a chiarirci a colpi di codice:



BindingSource.DataSource=Dataset.Tables("Tabella1") -Combobox1.DataSource = BindingSource -Combobox1.DisplayMember = "CampoDaVisualizzare" -Combobox2.DataSource = BindingSource -Combobox2.DisplayMember = "CampoDaVisualizzare" -Combobox2.DataBindings.Add(New Binding("Text", BindingSource, "CampoBindato"))

In questo modo, quando modifichi il valore della prima combobox, viene automaticamente modificato anche il valore della seconda in funzione della posizione in cui si trova il bindingsource.

Cosa non ti convince di questo codice???

Facci sapere...
Ciao

netgit Profilo | Newbie

Io non voglio assolutamente questo.
Mi serve avere due combo che listano uguali elementi, perchè arrivano dalla stessa datatable, ma che siano bindato a diversi campi di un DB.
E qui arriava la mia domanda, con le mie impostazioni, i due combo, se il data source è uguale al variare dcella selezione di una cambia anche la selezione dell'altro.
Le selezioni devono essere disgiunte e questo io lo ottengo solo fillando con gli stessi dati due datatable uguali con nomi diversi.
-purchase_tu_idCBO.DataSource = dsLookups.Tables("TU1sellLookup")
-purchase_tu_idCBO.DisplayMember = "IDdescr"
-purchase_tu_idCBO.ValueMember = "ID"
-purchase_tu_idCBO.DataBindings.Add(New Binding("SelectedValue", ItemsBindingSource, "purchase_tu_id", True))

-sell_tu_idCBO.DataSource = dsLookups.Tables("TU2sellLookup")
-sell_tu_idCBO.DisplayMember = "IDdescr"
-sell_tu_idCBO.ValueMember = "ID"
-sell_tu_idCBO.DataBindings.Add(New Binding("SelectedValue", ItemsBindingSource, "sell_tu_id", True))

Jeremy Profilo | Guru

Ok .... adesso ho capito l'obbiettivo (FORSE).

Rimane il fatto che si può risolvere in un modo un pò meno *sporco*
Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

In questo modo il *contenitore* è sempre lo stesso, sono i BindingSource che sono diversi ed indipendenti....il che dovrebbe risolvere i tuoi dubbi.
Questo codice non l'ho provato ma, concettualmente, dovrebbe funzionare.
L'altra alternativa è l'utilizzo di LINQ To Datasets...il quale, sarebbe ancora meglio.

Ad ogni modo...prova così e .... facci sapere..
Ciao

netgit Profilo | Newbie

Grazie alle tue indicazioni precisamente ho risolto così :
Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra
Finalmente
Pensa che tempo fa ho comprato ADO.NET della WROX (hoepli informatica), dopo il tuo ultimo consiglio l'ho consultato ma non esiste un paragrafo che mi spieghi nel dettaglio cosa realizza un bindigsource.
Grazie ancora e 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