Salve a tutti,
sono alcuni giorni che stò cercando la soluzione ad un problema sicuramente molto semplice:
ho creato una applicazione mdi, con VB2010, che utilizza un database xml.
nell'interfaccia compaiono 2 finestre anche contemporaneamente, nella prima faccio tutte le operazioni di inserimento, modifica, cancellazione, etc... nella seconda utilizzo un datagridview (con bindingsource creato a manina da me) solo per mostrare i dati gestiti con l'altra finestra.
e fin qui tutto ok.
Il problema viene ora. Avendo entrambe le finestre aperte vorrei poter ricaricare i dati nella seconda finestra senza doverla richiudere e riaprire. Magari con il classico pulsante 'aggiorna'.
E' possibile far ciò?
Posto un poco di codice della finestra che mostra i dati.
Grazie,
codice:
Dim tables As DataTableCollection = DataSet11.Tables
Dim view1 As New DataView(tables(3))
' Create a DataGridView control and add it to the form.
'Dim datagridview1 As New DataGridView()
'datagridview1.AutoGenerateColumns = True
'Me.Controls.Add(datagridview1)
' Create a BindingSource and set its DataSource property to
' the DataView.
Dim source1 As New BindingSource()
source1.DataSource = view1
' The Filter string can include Boolean expressions.
'MsgBox("data_i >= '" & data_i.ToShortDateString.ToString & " 07:00' and data_f <= '" & data_f.ToShortDateString.ToString & " 20:00'")
' Modifica del filtro per riempire il planner. Procedura richiamata 4 volte per inserire tutti i pazienti,
' compresi coloro che nella settimana corrente, o hanno iniziato prima o finiscono dopo.
' Attenzione: il valore di id_terapista è statico. vale solo 0 (doc) o 1 (mask).
' Primo richiamo...
If dvgRef.Name = "dvgPlanner" Then
source1.Filter = "(data_i >= '" & data_i.ToShortDateString.ToString & " 07:00' and data_f <= '" & _
data_f.ToShortDateString.ToString & " 20:00' and id_terapista = 0)"
Else
source1.Filter = "(data_i >= '" & data_i.ToShortDateString.ToString & " 07:00' and data_f <= '" & _
data_f.ToShortDateString.ToString & " 20:00' and id_terapista = 1)"
End If
' Se abbiamo dati da mostrare, richiamo la funzione...
If source1.Count > 0 Then
RiempiTabPlannerDetails(source1, tables, view1, dvgRef, data_i, data_f)
End If
' ------------------------------------------------------------------
Private Sub RiempiTabPlannerDetails(ByRef source1 As BindingSource, ByRef tables As DataTableCollection, ByRef view1 As DataView, ByRef dvgRef As DataGridView, ByVal v_data_i As Date, ByVal v_data_f As Date)
' Impostiamo i pazienti nella griglia...
Dim v_riga As Integer = 0
Dim v_colonna As Integer = 0
' variabili per ottenere il cognome ed il nome della persona...
Dim view2 As New DataView(tables(0)) ' Persona
Dim source2 As New BindingSource()
source2.DataSource = view2
For i As Integer = 0 To source1.Count - 1
'MsgBox(source1.Count & ": " & source1(i)("id_persona") & ", " & source1(i)("data_i") & ", " & source1(i)("data_f"))
If (source1(i)("data_i") >= v_data_i And source1(i)("data_i") <= v_data_f) Then
v_data_i = source1(i)("data_i")
Else
' in questo caso prendo almeno l'orario finale...
Dim provvData As DateTime
provvData = New DateTime(v_data_i.Year, v_data_i.Month, v_data_i.Day, source1(i)("data_i").Hour, source1(i)("data_i").Minute, 0)
v_data_i = provvData
End If
If (source1(i)("data_f") <= v_data_f And source1(i)("data_f") >= v_data_i) Then
v_data_f = source1(i)("data_f")
Else
' in questo caso prendo almeno l'orario finale...
Dim provvData As DateTime
provvData = New DateTime(v_data_f.Year, v_data_f.Month, v_data_f.Day, source1(i)("data_f").Hour, source1(i)("data_f").Minute, 0)
v_data_f = provvData
End If
' calcolo della riga...
If v_data_i.DayOfWeek = 0 Then
v_colonna = 6
Else
v_colonna = v_data_i.DayOfWeek - 1
End If
' calcolo della colonna...
v_riga = 4 * (v_data_i.Hour - 8)
If v_data_i.Minute = 15 Then
v_riga += 1
ElseIf v_data_i.Minute = 30 Then
v_riga += 2
ElseIf v_data_i.Minute = 45 Then
v_riga += 3
End If
' Filtro la tabella delle persone per ottenere il cognome ed il nome...
source2.Filter = "id_persona = '" & source1(i)("id_persona").ToString & "'"
' mostro i dati nella griglia.
' occorre controllare quante caselle debbono contenere il cognome ed il nome
' per andarlo a scrivere...
Dim n_righe, n_colonne As Integer
' variabili per il calcolo delle righe...
Dim n_dt_i, n_dt_f As Integer
n_colonne = 1 + DatePart(DateInterval.Day, v_data_f) - DatePart(DateInterval.Day, v_data_i)
' calcolo il numero di righe da scrivere, in base alla differenza delle ore...
n_dt_i = f_calcolaRighe(v_data_i)
n_dt_f = f_calcolaRighe(v_data_f)
n_righe = (n_dt_f - n_dt_i) / 15