Databindings

mercoledì 26 novembre 2008 - 17.36

Idea Grip Profilo | Newbie

Buonasera a tutti del forum
Ho un problema con i databindings di 2 combobox.

questo è il codice che ho scritto:
Me.CmbCodF.DataBindings.Clear()
Me.CmbRagF.DataBindings.Clear()
Me.CmbCodF.DataBindings.Add("text", objdataview1, "codforn")
Me.CmbRagF.DataBindings.Add("text", objdataview1, "fornitore")

Funziona tutto quasi perfettamente, scelgo il primo item nella CmbRagF, questo non sincronizza la combobox CmbCodF.

Riprovo e scelgo dal secondo item in poi(uno qualsiasi) nella CmbRagF, tutto funziona, anche se torno a scegliere il primo item nella CmbRagF.

Nella seconda combobox CmbCodF, non mi sincronizza se scelgo il secondo item , mentre tutti gli altri funzionano(anche il primo), e poi torna a funzionare anche se scelgo il secondo item della CmbCodF.

Non capisco è tutto collegato fin dall'inizio.
Spero di essere stato chiaro.
Ringrazio anticipatamente coloro che vorranno rispondermi.

Buonasera

Teech Profilo | Expert

In che evento l'hai scritto questo codice?
--------------
Maurizio Brini
--------------
Nessuna impresa è mai stata compiuta da un uomo ragionevole

Idea Grip Profilo | Newbie

Ho creato una routine che viene chiamata all'apertura del form e di nuovo dopo i salvataggi delle righe.
Ho provato a gestire con l'evento selectedindexchanged una ricerca diretta nel dataset, ma sembra che il testo scelto viene caricato dopo questo evento, quindi non ho risolto ugualmente.
Comunque non volevo appesantire l'applicazione con continue ricerche sugli eventi delle combo, la mia idea è quella di sfruttare il databindings.

......
Ok, dopo ulteriore analisi ho scoperto il problema, in pratica quando voglio creare una nuova riga con un tasto nuovo semplicemente svuoto le combobox cosi:
Me.CmbCodF.Text = ""
Me.CmbRagF.Text = ""
il problema sta nel fatto che se scelgo lo stesso un item che aveva la riga precedente giustamente non succede nulla fino a che non cambio item.
Per correggere il problema ho cercato di svuotare anche valuemember, selectedindex,selectedvalue cosi:
Me.CmbRagF.ValueMember = Nothing
Me.CmbRagF.SelectedValue = Nothing
Me.CmbRagF.SelectedIndex = Nothing
Me.CmbDodF.ValueMember = Nothing
Me.CmbCodF.SelectedValue = Nothing
Me.CmbCodF.SelectedIndex = Nothing

ho tentato diverse combinazioni, ma senza risultati apprezzabili, ho anche ricollegato le combo richiamando la routine sopracitata dopo averle svuotate, ma niente, il risultato è che vedo le combobox con i dati della riga precedente.

Ho esaurito le idee, come faccio a resettare i databindings?

Teech Profilo | Expert

Se ho capito bene, per fare quello che desideri puoi usare l'oggetto BindingSource... Assegni la tua "tabella" al bindingsource e il Binding dei controlli lo imposti sul BindingSource invece che sulla "tabella"...
http://msdn.microsoft.com/it-it/library/system.windows.forms.bindingsource(VS.80).aspx
--------------
Maurizio Brini
--------------
Nessuna impresa è mai stata compiuta da un uomo ragionevole

Idea Grip Profilo | Newbie

Teech, ho provato come mi hai consigliato, ma non c'è verso se tento di svuotare il datamember ed il datasource del oggetto bindingsource, mi va in errore, se non lo faccio il risultato non cambia rispetto a prima, eppure sembrerebbe cosi semplice, se riuscissi a capire cosa o come devo cancellare il riferimento all'item selezionato credo che risolverei.

Mi toccherà ripiegare al lost focus delle comobobx e ricaricare ogni volta i collegamenti, se non trovo una soluzione meno dolorosa..

Teech Profilo | Expert

Non so che collection usi come Datasource delle tue ComboBox, ma ipotizziamo sia un DataTable, puoi dichiarare una variabile a livelo di classe per il BindingSource (poniamo "Private bs as BindingSource") e procedere così nella Load del Form:
'Popola il controllo BindingSource bs = New BindingSource bs.DataSource = TuoDataTable 'Popola le ComboBox With cbCodice .DataSource = bs .DisplayMember = "Codice" .ValueMember = "Codice" End With With cbDescrizione .DataSource = bs .DisplayMember = "Descrizione" .ValueMember = "Codice" End With
Se devi cambiare Datasource puoi aggiungere del codice tipo questo per per aggiornare (nel punto che ritieni più opportuno):
bs.DataSource = TuoDataTable 'Dopo aver aggiornato il contenuto del DataTable 'Reimposta dati sulle ComboBox cbCodice.DataSource = Nothing cbCodice.DataSource = bs cbDescrizione.DataSource = Nothing cbDescrizione.DataSource = bs
Non importa cambiare il ValueMember e DisplayMember a meno che non sostituisci anche i nomi delle colonne del DataTable.
A questo punto puoi recuperare i dati che ti interessano dal BindingSource:
Dim s As String=CType(bs.Current, DataRow).item("NomeColonna").ToString

P.S.: Il codice l'ho scritto al volo quindi potrebbe non funzionare, ma il concetto è quello
--------------
Maurizio Brini
--------------
Nessuna impresa è mai stata compiuta da un uomo ragionevole

Idea Grip Profilo | Newbie

Purtroppo Teech non va lo stesso, appena carico il datasource si ripristinano gli oggetti come prima.
Eppure basterebbe a mio avviso che quando scelgo un item in una combobox(che è già selezionato, ma di cui ho cancellato il testo) tutte le altre si risincronizzino.

Oppure devo caricare una riga vuota nel Database ma vedrei la riga vuota anche all'interno delle combo, e non è bello.

!! che fatica !!

Teech Profilo | Expert

Scusami ma non capisco cosa vuoi fare: vuoi che cambiando l'item di una Combobox le altre si sincronizzino su un DataTable popolato? Se è così il codice che ti ho postato covrebbe funzionare (quantomeno concettualmente)... Se devi fare altro non ho capito cosa vuoi fare...
--------------
Maurizio Brini
--------------
Nessuna impresa è mai stata compiuta da un uomo ragionevole

Idea Grip Profilo | Newbie

Ok, provo a spiegarmi meglio, in pratica ho una maschera in cui devo caricare delle registrazioni passive in una tabella, in questa maschera ci sono due combobox che ho riempito con i dati dei fornitori prelevati da un'altra tabella(codice e ragione sociale), il tutto naturalmente collegato (databindings) alla tabella delle registrazioni, funziona tutto perfettamente(quasi).

Quando voglio caricare una nuova registrazione premo il tasto nuovo, con questo tasto cancello il testo visibile in tutte le combobox per avere la maschera pulita.

Mettiamo il caso che ho il fornitore

Ragione sociale "Azienda A"
codice "0001"

ed il fornitore

Ragione sociale "Azienda B"
codice "0002"

Se la registrazione precedente aveva "Azienda B" dopo che ho premuto il tasto nuovo, se scelgo "Azienda B" nella combobox Ragione sociale, nella combobox codice non compare "0002"(o viceversa), se avessi scelto "Azienda A" nella combobox ragione sociale, nella combobox codice sarebbe comparso "0001"(o viceversa).

Probabilmente elimino il testo dalle combobox ma sono ancora nell'item selezionato, per questo motivo non si carica il testo nell'altra combobox.

Teech Profilo | Expert

L'errore, secondo me, stà nel fatto che vuoti la proprietà text dei controlli... Non serve... Se vuoi creare un nuovo record devi lavorare sul DataSource e non sull'interfaccia. Ad esempio, crei un nuovo DataRow sul DataTable poi ti posizioni su quello con il BindingSource ed automaticamente si vuotano i controlli... Non è corretto agire sull'interfaccia in questo caso

--------------
Maurizio Brini
--------------
Nessuna impresa è mai stata compiuta da un uomo ragionevole

alexmed Profilo | Guru

Ciao
Quello che stò per suggerirti non l'ho estato, ma quando clikki su nuovo non basta, per "pulire" le Combo:
comboBox1.SelectedIndex = -1

Ciao

Idea Grip Profilo | Newbie

Grazie Alexmed e anche Teech, purtroppo anche con combobox.selectedindex = -1 non funziona, ho dovuto ripiegare su Lostfocus della combobox nella quale richiamo la posizione stessa solo nel caso la combobox controparte non abbia testo, funziona bene e sembra non rallentare troppo,... pazienza
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