PDA

View Full Version : [VB.NET]Caricamento dati una sola volta


RaouL_BennetH
29-11-2008, 13:43
Ciao a tutti :)

Il mio problema è questo:

Ho degli oggetti che vengono caricati a runtime su di un form.

Alcuni di questi oggetti sono legati ad una fonte dati e da essa traggono determinati valori.

Ora mi succede questo:

Sul form c'è un oggetto di tipo TabControl.

In corrispondenza del TabPage 1, devo caricare determinati dati.

Mi sembrava semplice utilizzando l'evento selected index changed...

...ma, ovviamente il codice che ho scritto viene eseguito ogni volta che questo tab viene selezionato e, di conseguenza, se l'utente aveva variato dei valori dal form, si ritrova con i valori precedenti al cambio tab.

Mi sono detto quindi, vabbè, la funzione la eseguo durante il caricamento del form....

Ovviamente, non funziona, cioè, se lo stesso codice scritto nell'evento selectedIndexChanged lo metto nel Form_Load non ha alcun effetto.

il codice incriminato è:



Sub BindColors(ByVal panel As Panel, ByVal idColor As Integer)

Try
Dim ds As New IndexColorTableAdapter.GetDescription

For Each gp As GroupBox in panel.Controls

For Each txt As TextBox in gp.Controls

Dim tblIndexColors As New DataSet

tblIndexColors.Tables.Add(ds.GetDataById(idColor, g.Text.SubString(0, 2))

txt.DataBindings.Add("Text", tblIndexColors.Tables(0), "Descrizione")
txt.DataBindings.Remove(txt.DataBindings("Text"))
Next
Next

Catch ex As Exception
'blabla
End Try


Grazie mille :)

RaouL.

MarcoGG
30-11-2008, 08:59
Mi sembrava semplice utilizzando l'evento selected index changed...

...ma, ovviamente il codice che ho scritto viene eseguito ogni volta che questo tab viene selezionato e, di conseguenza, se l'utente aveva variato dei valori dal form, si ritrova con i valori precedenti al cambio tab.


Se l'utente varia dei valori puoi eseguirne il commit a DB prima del caricamento dati sul Tab Change... O no ?


il codice incriminato è:



Sub BindColors(ByVal panel As Panel, ByVal idColor As Integer)

Try
Dim ds As New IndexColorTableAdapter.GetDescription

For Each gp As GroupBox in panel.Controls

For Each txt As TextBox in gp.Controls

Dim tblIndexColors As New DataSet

tblIndexColors.Tables.Add(ds.GetDataById(idColor, g.Text.SubString(0, 2))

txt.DataBindings.Add("Text", tblIndexColors.Tables(0), "Descrizione")
txt.DataBindings.Remove(txt.DataBindings("Text"))
Next
Next

Catch ex As Exception
'blabla
End Try


Grazie mille :)

RaouL.

Già provato ad escludere il blocco Try/Catch per vedere se e dove va in errore ?

RaouL_BennetH
30-11-2008, 09:37
Se l'utente varia dei valori puoi eseguirne il commit a DB prima del caricamento dati sul Tab Change... O no ?


Eh no, non sarebbe conveniente perchè l'utente potrebbe decidere di variare ennemila volte quei valori; avrei quindi per ciascun utente una serie di connessioni al db abbastanza allarmante :p



Già provato ad escludere il blocco Try/Catch per vedere se e dove va in errore ?

Il problema è che l'avevo messo proprio perchè non mi sollevava nessuna eccezione :(

MarcoGG
01-12-2008, 08:17
Eh no, non sarebbe conveniente perchè l'utente potrebbe decidere di variare ennemila volte quei valori; avrei quindi per ciascun utente una serie di connessioni al db abbastanza allarmante :p


Beh, questa non era una domanda scontata, dato che non avevi specificato si trattasse di n applicazioni client che vanno a scrivere sullo stesso DB.
Inoltre non hai considerato l'ipotesi di avere un DataSet in locale, che prenda ogni modifica utente e poi una volta sola aggiorni in blocco le modifiche a DB...
Comunque se quel codice dici che funziona sul TabChange, una soluzione "furbetta" ce l'hai già a portata di mano : all'avvio del Form forzi la selezione del Tab via codice, una volta sola ( definendo e poi controllando un'apposita variabile Boolean a livello di Form... ).
Allora :

Private Sub Form_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

TabControl1.SelectTab("TabPage2")
TabControl1.SelectTab("TabPage1")

End Sub

produrrà lo stesso effetto di :

Private Sub TabControl1_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles TabControl1.SelectedIndexChanged

If TabControl1.SelectedTab.Name = "TabPage1" Then
MsgBox("Hai selezionato TabPage1")
End If

End Sub

Non sarà il massimo, ma meglio che niente... ;)

RaouL_BennetH
01-12-2008, 08:31
Ciao :)

Ho risolto in un altro modo credo abbastanza semplice.

Ho impostato una variabile di tipo intero alla selezione del tab.

Una volta che il tab è stato selezionato, la variabile assume valore '1'.

Ogni volta che l'utente rientra in quel tab, se la variabile è uno allora i dati non vengono più caricati.

Ho fatto diverse prove e sembra reggere.

Grazie ancora.

RaouL.

MarcoGG
01-12-2008, 08:34
Già. :)
Più o meno siamo arrivati alla stessa soluzione "furba"... :D