2010-03-30 6 views
0

C'est un problème très semblable à This one, malheureusement que l'on n'a jamais répondu non plus.MessageBox ne montre pas sur la forme de MDI après un long calcul

J'ai un forum MDI principal qui héberge plusieurs formulaires enfants. L'un d'eux effectue un long calcul et déclenche une exception si une erreur survient (tout le travail est effectué sur le même thread). J'essaie alors d'informer l'utilisateur d'une erreur avec une boîte de message, mais elle n'apparaît pas (mais vole le focus de MDI Main, donc l'application ne répond pas du tout).

Le beheviour change légèrement si j'appelle Application.DoEvents() (je sais mal, mais c'est une dernière chose). Ensuite, les formulaires restent complètement actifs et la boîte de message n'apparaît qu'après avoir changé l'application active (Alt + Tab) en quelque chose d'autre, puis de nouveau à nouveau.

Que puis-je faire pour m'assurer que la boîte de message sera visible? J'ai déjà essayé de passer les deux, enfant actif et MDI principal en tant que paramètre à la méthode MessageBox.Show. Cela ne change pas le comportement.

Pour clarifier: la messagebox est une partie de la forme de l'enfant, mais à ce moment je suis prêt à le montrer d'une façon qui ne pause l'application. La boîte à message doit être modale, mais elle doit être visible afin qu'elle puisse être reconnue par l'utilisateur.

+0

Avez-vous encore des problèmes avec cela? – ChrisBD

+0

J'ai écrit un work-around qui utilise un autre thread pour afficher la boîte de message. Je ne pense toujours pas que cette question a une réponse et ma solution est une solution de contournement, donc je ne pense pas que je vais l'utiliser pour répondre à ma propre question. –

Répondre

0

Le MessageBox est-il affiché dans la MainForm ou dans le cadre de ChildForms? Si le MessageBox est dans les formulaires enfants, vous pourriez peut-être renvoyer un événement à MainForm et y ouvrir le MessageBox.

0

Le problème est que les boîtes de message ont tendance à être modales. Dans ce cas, je pense que vous feriez mieux d'utiliser un délégué ou un événement avec un gestionnaire dans votre code MDI principal. De cette façon, votre application principale affiche les boîtes de message. Vous pouvez facilement redéfinir un EventArgsType si vous souhaitez transmettre les informations dont vous avez besoin.

1

J'ai eu le même problème. Lorsque vous appuyez sur ALT, la fenêtre contextuelle s'affiche.

Il s'est avéré être un LinkedLabel qui avait la propriété AutoSize à true. Le LinkedLabel était dans un FlowLayoutPanel. Lorsque j'ai défini la propriété LinkedLabel.Text sur String.Empty. Le LinkedLabel essayait constamment de redimensionner, ce qui provoquait l'occupation constante de l'interface graphique.

Lorsque j'ai désactivé la propriété AutoSize et l'interface graphique n'a plus eu à recalculer les positions. L'interface graphique n'était pas gratuite. Et la popup a montré.

Il peut y avoir d'autres commandes qui se comportent de la même manière. Voir aussi: https://connect.microsoft.com/VisualStudio/feedback/details/116884