Datagridview incompleto

venerdì 26 settembre 2008 - 12.06

denis.basei Profilo | Senior Member

Salve a tutti!
Ho sviluppato una applicazione con vb net. C' è un form con due datagridview che da a volte problemi all'operatore. La seconda datagridview è in relazione con la prima e visualizza solo le righe associate. Saltuariamente capita che da una certa riga in poi la seconda datagridview non sia più popolata. Se viene applicato un filtro che riesegue la Fill dei datatable associati i dati tornano fuori. Ancor più strano è che questo succede solo su un client. Su altri client con la stessa applicazione ciò non succede. Potrebbe essere un problema di memoria? In effetti il pc in questione è un pò vecchiotto. I records sono in media un migliaio per la prima datagridview, il doppio per la seconda.


Grazie

Denis
Denis B. - www.baseiengineering.com

freeteo Profilo | Guru

ciao,
la cosa sembra strana effettiavamente, perchè un problema di memoria per un migliaio di righe mi sembrano pochi dati per averli...ma quanta RAM hai su quel pc?
Percaso hai campi blob molto grossi?

Forse potrebbe essere un problema di versione di Mdac, ovvero librerie di accesso ai dati che con connessioni OleDb può usare, di sistema sono presenti e il framework le installa, però magari si sono sporcate con qualche altra installazione nel frattempo...

Oppure dato che sono legate le 2 tabelle, hai dati che hanno formati diversi (penso ad un datetime in lingua inglese che mette prima il mese e poi il giorno) e quindi la join non torna righe.
Quest'ultimo problema dovresti averlo però sempre, sistematicamente rifacendo gli stessi passi.

Eventualmente prova a postare 1po di codice che vediamo se si nasconde qualcosa...
ciao.

Matteo Raumer
[MCAD .net]
http://blogs.dotnethell.it/freeteo

denis.basei Profilo | Senior Member

Il codice che ti posto è relativo all'evento scatenato quando viene applicato un filtro. Le datatable origine dati delle datagridview sono rispettivamente FileTest_CNC (master) e FileRighe_CNC (detail). Le datatable Carico_Testata, Carico_Padri e Carico_Figli sono popolate perchè ci sono delle label nel form che vengono aggiornate, sulla base della riga corrente di un datagridview, pescando i dati da queste 3 tabelle.

Private Sub tsbuFiltra_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles tsbuFiltra.Click
Try
' Il filtro su IDMacchina e FlagFM deve contenere un valore.
If Not Me.tscbIDMacchina.Text = "" And Not Me.tscFlagFM.Text = "" Then
' Svuoto il contenuto delle datatable dall'ultimo figlio fino al padre...
Me.AppWorkdbDataSet.Carico_Figli.Clear()
Me.AppWorkdbDataSet.Carico_Padri.Clear()
Me.AppWorkdbDataSet.Carico_Testata.Clear()

Me.taCarico_Testata.Fill(Me.AppWorkdbDataSet.Carico_Testata)
Me.taCarico_Padri.Fill(Me.AppWorkdbDataSet.Carico_Padri)
Me.taCarico_Figli.Fill(Me.AppWorkdbDataSet.Carico_Figli)

Dim tmpFM As Byte = 9 ' Assegno 9 come valore di default perchè 0 è un valore significativo.
If Me.tscFlagFM.Text = "Serie" Then
tmpFM = 0
ElseIf Me.tscFlagFM.Text = "Fuori mis." Then
tmpFM = 1
End If

Dim tmpIDMacchina As Byte = Me.tscbIDMacchina.ComboBox.SelectedValue
' Se nel filtro del numero di carico non è stato indicato nulla interpreto che devo considerare tutti i carichi.
If Me.tstxtNumCarico.Text > "" Then
Dim drCarico_Testata As DataRow()
drCarico_Testata = Me.AppWorkdbDataSet.Carico_Testata.Select("NumCarico = " & CType(Me.tstxtNumCarico.Text, Int16))
If drCarico_Testata.Length > 0 Then
' Svuoto il contenuto delle datatable così da non lasciare eventuali records di FileRighe_CNC senza il rispettivo padre in FileTest_CNC.
Me.AppWorkdbDataSet.FileRighe_CNC.Clear()
Me.AppWorkdbDataSet.FileTest_CNC.Clear()

Dim tmpIDCarico As Int32 = drCarico_Testata(0)("IDCarico")
If tmpFM = 0 Or tmpFM = 1 Then
If Me.tscCodPadre.Text = "" And Me.tscCodFiglio.Text = "" And Me.tscOrdine.Text = "" Then
Me.FileTest_CNCTableAdapter.FillByIDCaricoIDMacchinaFlagFM(Me.AppWorkdbDataSet.FileTest_CNC, tmpIDCarico, tmpIDMacchina, tmpFM)
ElseIf Me.tscCodPadre.Text > "" And Me.tscCodFiglio.Text = "" And Me.tscOrdine.Text = "" Then
Me.FileTest_CNCTableAdapter.FillByIDCaricoIDMacchinaFlagFMCodPadre(Me.AppWorkdbDataSet.FileTest_CNC, tmpIDCarico, tmpIDMacchina, tmpFM, Me.tscCodPadre.Text)
ElseIf Me.tscCodPadre.Text = "" And Me.tscCodFiglio.Text > "" And Me.tscOrdine.Text = "" Then
Me.FileTest_CNCTableAdapter.FillByIDCaricoIDMacchinaFlagFMCodFiglio(Me.AppWorkdbDataSet.FileTest_CNC, tmpIDCarico, tmpIDMacchina, tmpFM, Me.tscCodFiglio.Text)
ElseIf Me.tscCodPadre.Text > "" And Me.tscCodFiglio.Text > "" And Me.tscOrdine.Text = "" Then
Me.FileTest_CNCTableAdapter.FillByIDCaricoIDMacchinaFlagFMPadreFiglio(Me.AppWorkdbDataSet.FileTest_CNC, Me.tscCodPadre.Text, Me.tscCodFiglio.Text, tmpIDCarico, tmpIDMacchina, tmpFM)
ElseIf Me.tscCodPadre.Text = "" And Me.tscCodFiglio.Text = "" And Me.tscOrdine.Text > "" Then
Me.FileTest_CNCTableAdapter.FillByIDCaricoIDMacchinaFlagFMNumOrdine(Me.AppWorkdbDataSet.FileTest_CNC, tmpIDCarico, tmpIDMacchina, tmpFM, CType(Me.tscOrdine.Text, Int32))
ElseIf Me.tscCodPadre.Text > "" And Me.tscCodFiglio.Text = "" And Me.tscOrdine.Text > "" Then
Me.FileTest_CNCTableAdapter.FillByIDCaricoIDMacchinaFlagFMCodPadreNumOrdine(Me.AppWorkdbDataSet.FileTest_CNC, tmpIDCarico, tmpIDMacchina, tmpFM, Me.tscCodPadre.Text, CType(Me.tscOrdine.Text, Int32))
ElseIf Me.tscCodPadre.Text = "" And Me.tscCodFiglio.Text > "" And Me.tscOrdine.Text > "" Then
Me.FileTest_CNCTableAdapter.FillByIDCaricoIDMacchinaFlagFMCodFiglioNumOrdine(Me.AppWorkdbDataSet.FileTest_CNC, tmpIDCarico, tmpIDMacchina, tmpFM, Me.tscCodFiglio.Text, CType(Me.tscOrdine.Text, Int32))
ElseIf Me.tscCodPadre.Text > "" And Me.tscCodFiglio.Text > "" And Me.tscOrdine.Text > "" Then
Me.FileTest_CNCTableAdapter.FillByIDCaricoIDMacchinaFlagFMPadreFiglioOrdine(Me.AppWorkdbDataSet.FileTest_CNC, Me.tscCodPadre.Text, Me.tscCodFiglio.Text, tmpIDCarico, tmpIDMacchina, tmpFM, CType(Me.tscOrdine.Text, Int32))
End If
Else ' E' stata selezionata la voce "Tutti" sul filtro per Tipo.
If Me.tscCodPadre.Text = "" And Me.tscCodFiglio.Text = "" And Me.tscOrdine.Text = "" Then
Me.FileTest_CNCTableAdapter.FillByIDCaricoIDMacchina(Me.AppWorkdbDataSet.FileTest_CNC, tmpIDCarico, tmpIDMacchina)
ElseIf Me.tscCodPadre.Text > "" And Me.tscCodFiglio.Text = "" And Me.tscOrdine.Text = "" Then
Me.FileTest_CNCTableAdapter.FillByIDCaricoIDMacchinaCodPadre(Me.AppWorkdbDataSet.FileTest_CNC, tmpIDCarico, tmpIDMacchina, Me.tscCodPadre.Text)
ElseIf Me.tscCodPadre.Text = "" And Me.tscCodFiglio.Text > "" And Me.tscOrdine.Text = "" Then
Me.FileTest_CNCTableAdapter.FillByIDCaricoIDMacchinaCodFiglio(Me.AppWorkdbDataSet.FileTest_CNC, tmpIDCarico, tmpIDMacchina, Me.tscCodFiglio.Text)
ElseIf Me.tscCodPadre.Text > "" And Me.tscCodFiglio.Text > "" And Me.tscOrdine.Text = "" Then
Me.FileTest_CNCTableAdapter.FillByIDCaricoIDMacchinaPadreFiglio(Me.AppWorkdbDataSet.FileTest_CNC, tmpIDCarico, tmpIDMacchina, Me.tscCodFiglio.Text, Me.tscCodPadre.Text)
ElseIf Me.tscCodPadre.Text = "" And Me.tscCodFiglio.Text = "" And Me.tscOrdine.Text > "" Then
Me.FileTest_CNCTableAdapter.FillByIDCaricoIDMacchinaNumOrdine(Me.AppWorkdbDataSet.FileTest_CNC, tmpIDCarico, tmpIDMacchina, CType(Me.tscOrdine.Text, Int32))
ElseIf Me.tscCodPadre.Text > "" And Me.tscCodFiglio.Text = "" And Me.tscOrdine.Text > "" Then
Me.FileTest_CNCTableAdapter.FillByIDCaricoIDMacchinaCodPadreNumOrdine(Me.AppWorkdbDataSet.FileTest_CNC, tmpIDCarico, tmpIDMacchina, Me.tscCodPadre.Text, CType(Me.tscOrdine.Text, Int32))
ElseIf Me.tscCodPadre.Text = "" And Me.tscCodFiglio.Text > "" And Me.tscOrdine.Text > "" Then
Me.FileTest_CNCTableAdapter.FillByIDCaricoIDMacchinaCodFiglioNumOrdine(Me.AppWorkdbDataSet.FileTest_CNC, tmpIDCarico, tmpIDMacchina, Me.tscCodFiglio.Text, CType(Me.tscOrdine.Text, Int32))
ElseIf Me.tscCodPadre.Text > "" And Me.tscCodFiglio.Text > "" And Me.tscOrdine.Text > "" Then
Me.FileTest_CNCTableAdapter.FillByIDCaricoIDMacchinaPadreFiglioOrdine(Me.AppWorkdbDataSet.FileTest_CNC, tmpIDCarico, tmpIDMacchina, Me.tscCodFiglio.Text, Me.tscCodPadre.Text, CType(Me.tscOrdine.Text, Int32))
End If
End If
Me.FileRighe_CNCTableAdapter.FillByIDCaricoIDMacchina(Me.AppWorkdbDataSet.FileRighe_CNC, tmpIDCarico, tmpIDMacchina)
Else
MessageBox.Show("Nessun dato trovato.", "Produzione " & Me.tstxtNumCarico.Text & ":", MessageBoxButtons.OK, MessageBoxIcon.Information)
End If
Else
If tmpFM = 0 Or tmpFM = 1 Then
Me.FileTest_CNCTableAdapter.FillByIDMacchinaFlagFM(Me.AppWorkdbDataSet.FileTest_CNC, tmpIDMacchina, tmpFM)
Else
Me.FileTest_CNCTableAdapter.FillByIDMacchina(Me.AppWorkdbDataSet.FileTest_CNC, tmpIDMacchina)
End If
Me.FileRighe_CNCTableAdapter.FillByIDMacchina(Me.AppWorkdbDataSet.FileRighe_CNC, tmpIDMacchina)
End If
Else
MessageBox.Show("Richiesto un valore.", "Filtri IDMacchina, FlagFM:", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
End If


Catch ex As Exception
MessageBox.Show(ex.Message, "Sub tsbuFiltra_Click, form Mng_Produzione:", MessageBoxButtons.OK, MessageBoxIcon.Error)
End Try
End Sub


Grazie e ciao

Denis
Denis B. - www.baseiengineering.com

freeteo Profilo | Guru

il codice visto così non sembra avere particolari problemi, a parte che non capisco perchè prima carichi i dati cmq, e dopo rifai la query con il filtro...cmq nessun problema.

Hai provato a mettere qualche messagebox in qualche punto strategico come magari prima di fare le query o prima di fare i filtri, appena dopo la query filtrata etc...insomma qualcosa che ti dica passo per passo come si sta comportando.
Fatta questa versione di "debug" la compili e la lanci sulla macchina incriminata, così vedi che messaggi ti restituisce e li confronti con quelli che ti arrivano da una macchina che va correttamente...e magari restringi la parte di codice incriminata per capire se appunto è un problema di troppi dati, del sistema operativo o della sua lingua, della sua versione di mdac etc...
ciao.

Matteo Raumer
[MCAD .net]
http://blogs.dotnethell.it/freeteo

denis.basei Profilo | Senior Member

La .fill la faccio una sola volta nelle tabella FileTest_CNC e FileRighe_CNC. Nel frattempo sto preparando una soluzione "provvisoria" del problema: carico un numero parametrico di records alla volta nel datatable, se l'operatore vuole visualizzare i successivi records preme un apposito tasto. Terminati riparte dall'inizio. Voglio vedere se così ho gli stessi problemi. Cosa ne dici?


Buon week end
Denis B. - www.baseiengineering.com

freeteo Profilo | Guru

>Voglio vedere se così ho gli stessi problemi. Cosa ne dici?
mah direi che è l'unica cosa è fare appunto delle prove, dato che il motivo è sicuramente il pc, possono essere tantissime cose, l'unica è proprio andare per tentativi.
ciao.

Matteo Raumer
[MCAD .net]
http://blogs.dotnethell.it/freeteo
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