2016-10-18 4 views
0

Je travaille sur une application C#.InvalidOperationException sur ShowDialog

J'ai un objet utilisé comme une boîte de dialogue:

public partial class MyDialog : Form 

Les fenêtres principales est:

public class MyForm : Form 

je peux l'utiliser par:

public class ProgramApp 
{ 
    public static MyForm MainForm { get { return _mainForm; } } 
} 

Dans une fonction I peut utiliser les deux avec:

MyDialog dlg = new MyDialog(); 
dlg.ShowDialog(ProgramApp.MainForm); 

premier appel fonctionne bien, mais la seconde j'ai un System.InvalidOperationException avec HResult = 0x80131509 et un message:

opération de la Croix-fil non valide: contrôle « MainForm » accessible à partir d'un fil autre que le fil sur lequel il a été créé.

(traduit de messages français, original :)

« intercommunalité-fils non valid: le contrôle 'MainForm' un fait l'objet d'un à partir d'Accès fil un autre que celui sur où il a été créé. "

Que puis-je faire pour résoudre ce problème?

Edit:

J'ajouté ce morceau de code:

MyDialog dlg = new MyDialog(); 
bool needInvokeDlg = dlg.InvokeRequired; 
bool needInvokeForm = ProgramApp.MainForm.InvokeRequired; 
dlg.ShowDialog(ProgramApp.MainForm); 

Première tentative les deux sont faux. En second lieu, needInvokeForm est vrai. Comment puis-je faire un Invoke pour définir ProgramApp.MainForm en tant que paramètre?

+1

n'a pas trouvé de réponse dans le message original –

+1

@dotctor Pouvez-vous rouvrir la question s'il vous plaît? –

+1

Peut-être suffirait-il de simplement convertir le formulaire en l'interface 'IWin32Window' requise, c'est-à-dire' dlg.ShowDialog ((IWin32Window) ProgramApp.MainForm); 'car il n'y a pas d'élément d'interface utilisateur. – stuartd

Répondre

1

La boîte de dialogue doit être appelée sur le thread d'interface utilisateur.

Pour une discussion approfondie, voir this post.