Bonjour,
Je suis actuellement entrain de créer un explorateur de fichier distants via le protocole TCP, chaque client est affiché dans une ListView et lorsque qu'on double clic dessus l'un, la fenêtre de l'explorateur associée au client s'affiche.
J'ai donc un objet Dictionnary<ListViewItem, Client> clients, où Client contient le socket et la fenêtre associée au client.
De ce fait lorsque l'on double-clic dessus un Lvi, je fais :
Jusque là tout va bien, dans la liste des fichiers j'ai un menu contextuel qui contient des ToolStripMenuItem s'affichant sans problèmes. Cependant j'ai ajouté d'autres TSMI a ceux présents, de façon 'imbriqué', voici un schéma :
Code : Sélectionner tout - Visualiser dans une fenêtre à part clients[le lvi sélectionné].FileExplorer.ShowDialog();
- Supprimer
- Renommer
- Créer
-- Un dossier
-- Un fichier
- Dossiers spéciaux
-- Documents
-- Images
-- AppData
--- Roaming
--- Local
--- LocalLow
- Blabla
- Blabla
Je peux parfaitement afficher Créer > Un dossier ou Un fichier, en revanche des que je passe ma souris sur Dossier spéciaux, qui contient un 'enfant' supplémentaire de TSMI, une exception de type InvalidOperationException est levée me signalant qu'il y a eu une opération inter-thread.
Et le débogueur indique l'erreur a la ligne ou je fais apparaitre la fenêtre (Avec ShowDialog()).
Du coup je me pose plusieurs questions ... Comment cela se fait-il que dans le cas de Créer Un dossier ou Un fichier, il n'y a pas d'exception, et dans le cas où il y a des sous-TSMI supplémentaires il y a l'exception ?
J'ai vérifié et aucun thread ne fait un accès a une partie d'un contrôle a ce moment là, quand a la stack trace, que j'interprète peut être mal, il y a rapport avec une certaine méthode ShowDropDown qui viendrai je suppose du controle qui ne s'affiche pas car l'exception est levée a ce moment-là.
Je sais que cela parait peut être flou, bien que cela soit un pavé, mais je voulais être le plus clair possible ! Merci par avance.
Edit : voici le message de l'exception : Informations supplémentaires : Opération inter-threads non valide : le contrôle '' a fait l'objet d'un accès à partir d'un thread autre que celui sur lequel il a été créé.
(Pas de nom du contrôle, est-ce normal ?)
Et la stacktrace :
à System.Windows.Forms.Control.get_Handle()
à System.Windows.Forms.Control.SetBoundsCore(Int32 x, Int32 y, Int32 width, Int32 height, BoundsSpecified specified)
à System.Windows.Forms.ToolStrip.SetBoundsCore(Int32 x, Int32 y, Int32 width, Int32 height, BoundsSpecified specified)
à System.Windows.Forms.ToolStripDropDown.SetBoundsCore(Int32 x, Int32 y, Int32 width, Int32 height, BoundsSpecified specified)
à System.Windows.Forms.Control.SetBounds(Int32 x, Int32 y, Int32 width, Int32 height, BoundsSpecified specified)
à System.Windows.Forms.Control.set_Location(Point value)
à System.Windows.Forms.ToolStripDropDown.set_Location(Point value)
à System.Windows.Forms.ToolStripDropDownItem.ShowDropDownInternal()
à System.Windows.Forms.ToolStripDropDownItem.ShowDropDown(Boolean mousePush)
à System.Windows.Forms.ToolStripMenuItem.OnMenuAutoExpand()
à System.Windows.Forms.MenuTimer.OnTick(Object sender, EventArgs e)
à System.Windows.Forms.Timer.OnTick(EventArgs e)
à System.Windows.Forms.Timer.TimerNativeWindow.WndProc(Message& m)
à System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
à System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
à System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(Int32 dwComponentID, Int32 reason, Int32 pvLoopData)
à System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
à System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
à System.Windows.Forms.Application.RunDialog(Form form)
à System.Windows.Forms.Form.ShowDialog(IWin32Window owner)
à System.Windows.Forms.Form.ShowDialog()
à Kwartz.Interfacer.ShowFileManager(ListViewItem listViewItem) dans e:\Programmation\Projets\Travaux en cours\ProjectName\ProjectName\Interfacer.cs:ligne 267
Partager