Neow26
Messages postés50Date d'inscriptionmercredi 19 mars 2003StatutMembreDernière intervention12 mai 2007
-
1 août 2006 à 21:07
devsharp01
Messages postés1Date d'inscriptionvendredi 31 décembre 2010StatutMembreDernière intervention31 décembre 2010
-
31 déc. 2010 à 17:03
Salut tout le monde,
Je suis en train de réaliser un petit usercontrol pour une application qui pour d'afficher des données et de les conserver en mémoire.
Le principe est que je gère un DataSet en static dans lequel je remplit la collection DataTable.
Lors de l'éxécution d'une nouvelle requête je vérifie sa présence dans le DataSet, si elle existe je raffraichis ma table et je l'affecte comme source à mon DataGridView, sinon j'ajoute une table au DataSet et je l'affecte comme source au DataGridView.
Jusque là tout se passe sans soucis, je peux avoir 2 fois mon usercontrol sur la même source.
Après pour rendre la main à l'utilisateur quand j'exécute une requête, j'exécute mon traitement d'ajout ou de raffraichissement de table dans un nouveau thread. Quand j'ai des sources différentes pour chaque usercontrol tout marche bien, mais quand j'ai plusieurs usercontrol sur la même source, j'ai une exception :
L'exception suivante s'est produite dans le DataGridView :
System.IndexOutOfRangeException: L'index 0 n'a pas de valeur.
à System.Windows.Forms.CurrencyManager.get_Item(Int32 index)
à System.Windows.Forms.DataGridView.DataGridViewDataConnection.GetError(Int32 rowIndex)
J'avais une erreur identique au début (sans multithreading) parce que je ne mettais pas à Nothing la source de mon DataGridView.
Voilà mon problème, il faudrait que j'arrive à suspendre les événements des autres instances de mon usercontrol quand j'effectue un traitement, mais je ne vois pas comment. Si quelqu'un a une idée ou un moyen de controurner le problème je suis preneur.
pymaster
Messages postés74Date d'inscriptionvendredi 14 juillet 2006StatutMembreDernière intervention14 août 2006 1 août 2006 à 21:27
Bonjour !
Je ne vois pas de moyen pour suspendre entièrement les évènements, mais lorsque j'avais ce genre de prob avec des threads j'utilisais les mutex ( mutual exclusion ) et Semaphore pour limiter l'accès de certaines données à un nombre restrain de Thread
Par exemple :
Dans une classe commune au deux tu fais la décaration
Public shared mMutex as Mutex
Dans ton code qui ne doit pas être exécuté par 2 thread en même temps
mMutex.waitOne()
Bout de code
mMutex.ReleaseMutex()
Neow26
Messages postés50Date d'inscriptionmercredi 19 mars 2003StatutMembreDernière intervention12 mai 2007 1 août 2006 à 21:40
Merci pour ta réponse, mais ça ne réponds pas à mon problème car les événements qui entrainent l'exception découlent du changement de la source de données, ce n'est pas moi qui les gère.
C'est pour ça qu'il faudrait que j'arrive à faire en sorte que les événements ne soient plus relevés.
devsharp01
Messages postés1Date d'inscriptionvendredi 31 décembre 2010StatutMembreDernière intervention31 décembre 2010 31 déc. 2010 à 17:03
Bonjour,
J'ai eu le même problème (4 ans plus tard...) et la solution était dans la gestion du DataSource par le DataGridView. En effet, je faisais un :
DataTable.Rows.Clear();
Alors que ce DataTable était relié dans le DataSource de mon DataGridView... Donc forcément, même en effectuant des DataGridView.DataSource = ... à outrance, ça n'a pas suffit.
Le but étant d'effectuer qu'une seule fois un DataSource = ... Puis de faire le reste à coup de Refresh().