Home Page
Articoli
Tips & Tricks
News
Forum
Archivio Forum
Blogs
Sondaggi
Rss
Video
Utenti
Chi Siamo
Contattaci
Username:
Password:
Login
Registrati ora!
Recupera Password
Home Page
Stanze Forum
App. WinForms / WPF .NET
Problema DataGrid
mercoledì 23 giugno 2010 - 12.16
Elenco Threads
Stanze Forum
Aggiungi ai Preferiti
Cerca nel forum
giamisan
Profilo
| Newbie
48
messaggi | Data Invio:
mer 23 giu 2010 - 12:16
Ciao a tutti, ho un problema di questo tipo: nel mio form è presente una text box, un button e una DataGrid.
All'evento click del form vengono eseguiti alcune operazioni che possono generare eventi. Al generarsi di uno di questi eventi si deve compilare la DataGrid con dei dati, questo è il codice:
Private Sub table_OnSymbolGuide(ByVal sender As Object, ByVal e As DataEventArgs(Of SymbolGuideRecord))
For Each rec As SymbolGuideRecord In e
Dim row As String() = {rec.No, rec.Name, rec.Desc}
dgResult.Rows.Add(row)
Next
End Sub
Il problema è che se io eseguo questo codice in questo modo mi solleva una eccezione cross-thread che non sono attualmente in grado di gestire.
Posso ovviare a tale problema modificando la proprietà CheckForIllegalCrossThreadCalls della DataGrid a FALSE.
Purtroppo però nonostante io modifichi questa proprietà il tutto non funziona come dovrebbe perchè la DataGrid ha una dimensione tale per cui ci possono stare al suo interno circa 14 righe senza bisogno che si crei in automatico la scroll bar laterale. Siccome io non so a priori quante righe dovrò andare a mettere nella DataGrid mi succede che il tutto funziona bene fintanto che non serve la scroll bar ma se per esempio le righe dovranno essere 30 e quini deve creare in automatico la scroll bar il form non risponde più e devo chiudere il debug col quadratino.
E' necessario in ogni caso sincronizzare l'accesso con un delegato o basta eventualmente modificare quella proprietà a false (ovviamente perdendo in perfomance)? E se bastasse solo modificare quella proprietà, perchè quando sono tante righe mi si impalla?
Grazie mille
Giacomo
freeteo
Profilo
| Guru
6.542
messaggi | Data Invio:
gio 24 giu 2010 - 15:03
Ciao,
la cosa è leggermente complessa, prova a allegare un progetto d'esempio dove si verifica il problema che hai descritto e vediamo di analizzare come è meglio fare in base a quel caso concreto...
Ciao.
Matteo Raumer
[MCAD .net, MVP Visual C#]
http://blogs.dotnethell.it/freeteo
giamisan
Profilo
| Newbie
48
messaggi | Data Invio:
gio 24 giu 2010 - 15:23
Innanzitutto grazie per la risposta!!! Ti incollo tutto il codice del form che faccio prima!!!
Public Class frmRicerche
Inherits Form
Private _app As ToolkitApp
Public Sub New(ByVal app As ToolkitApp)
_app = app
InitializeComponent()
Me.Show()
End Sub
Private _evgGotData As New System.Threading.AutoResetEvent(False)
Private _evtConnected As System.Threading.AutoResetEvent = New System.Threading.AutoResetEvent(False)
Protected Sub Run(ByVal app As Toolkit.ToolkitApp, ByVal text As String)
Dim table As SymbolGuideTable = New SymbolGuideTable(app)
AddHandler table.OnSymbolGuide, AddressOf Me.table_OnSymbolGuide
AddHandler table.OnLive, AddressOf Me.table_OnLive
AddHandler table.OnDead, AddressOf Me.table_OnDead
table.Start()
table.WantData(table.TqlForSymbolData(text), True, False)
End Sub
Private Sub btnGO_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnGO.Click
Dim text As String = txtbox.Text
Me.Run(_app, text)
End Sub
Private Sub table_OnDead(ByVal sender As Object, ByVal e As EventArgs)
MsgBox("CONNESSIONE FALLITA")
_evgGotData.[Set]()
End Sub
Private Sub table_OnLive(ByVal sender As Object, ByVal e As EventArgs)
_evtConnected.[Set]()
End Sub
Private Sub table_OnSymbolGuide(ByVal sender As Object, ByVal e As DataEventArgs(Of SymbolGuideRecord))
For Each rec As SymbolGuideRecord In e
Dim row As String() = {rec.No, rec.Name, rec.Desc}
'Control.CheckForIllegalCrossThreadCalls = False
dgResult.Rows.Add(row)
Next
End Sub
End Class
Vedi, nel ciclo For...Each ora ci sono gli apici sulla proprietà CheckForIllegalCrossThreadCalls e se io provo a fare la ricerca mi da Operazione Cross-thread quando provo a inserire la riga in dgResult.
Se io tolgo quegli apici il programma funziona bene fintanto che non deve comparire la scroll bar nella DataGridView altrimenti mi spara fuori i dati con la scroll bar a lato ma come clicco nel Form l'applicazione non risponde più.
E' tutto l'altro ieri, tutto ieri e tutto oggi che provo a risolvere questo problema ma non riesco a capirlo...sarà anche e sicuramente per la mia poca esperienza!!!
Giusto a titolo informativo ho provato a compilare la DataGridView con dati a casaccio (numeri inventati da me) di modo da far comparire la barra dello scroll laterale e tutto funziona, ma quando provo a compilarla con i dati che realmente mi interessano mi da il cross-thread.....
freeteo
Profilo
| Guru
6.542
messaggi | Data Invio:
gio 24 giu 2010 - 20:59
1402_vb-multithread.zip
>Giusto a titolo informativo ho provato a compilare la DataGridView
>con dati a casaccio (numeri inventati da me) di modo da far comparire
>la barra dello scroll laterale e tutto funziona, ma quando provo
>a compilarla con i dati che realmente mi interessano mi da il cross-thread.....
mi dà l'idea che sia lanciato qualche altro thread magari internamente a qualche funzione di load dei dati...
Cmq ti ho allegato un esempio di multithreading usando l'Invoke del metodo dalla form principale, vedi se ti può tornare ujtile.
Ciao.
Matteo Raumer
[MCAD .net, MVP Visual C#]
http://blogs.dotnethell.it/freeteo
giamisan
Profilo
| Newbie
48
messaggi | Data Invio:
ven 25 giu 2010 - 11:11
Ciao!!!
Guarda, non so veramente come ringraziarti, grazie al tuo codice di esempio sono riuscito a risolvere il mio problema!!! Magari l'ho fatto in maniera poco ortodossa però penso che la giusta e miglior tecnica la si possa senz'altro affinare nel tempo, per ora mi interessa più che altro capire come muovermi visto che sono alle prime armi!!!
Grazie mille ancora freeteo, sei stato veramente ultra mega gentile!!!!
freeteo
Profilo
| Guru
6.542
messaggi | Data Invio:
ven 25 giu 2010 - 12:28
>Ciao!!!
>Guarda, non so veramente come ringraziarti, grazie al tuo codice
>di esempio sono riuscito a risolvere il mio problema!!! Magari
figurati, facciamo quello che possiamo
Sono contento che tu abbia risolto...alla prossima.
Ciao.
Matteo Raumer
[MCAD .net, MVP Visual C#]
http://blogs.dotnethell.it/freeteo
Torna su
Stanze Forum
Elenco Threads
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 !