2016-05-16 4 views
0

Je suis un développeur WinForms assez expérimenté. J'ai une MdiApplication qui fonctionnait bien. Cependant, récemment, le shell principal de l'application, pour lequel nous utilisons ComponentOne RibbonForm, a été mis à jour de façon importante. Cette mise à jour a affecté certains de nos autres composants tiers, ce que nous avons établi était dû à l'utilisation par ComponentOne de DoEvents() dans leur code d'événement. Je pensais avoir nettoyé tout le code causant des problèmes, mais je l'ai maintenant trouvé un autre ...WinForms MdiChildren Sélection et Activation

Quand j'ai plusieurs MdiChildren ouvert et sélectionnez l'un de ces derniers dans le code d'un événement de clic bouton sur la forme de ruban par

Les autres documents MdiChildren ouverts ont encore le focus, que les formulaires sont mis en surbrillance et que l'entrée n'est pas définie sur le document que j'ai défini dans le code

Deux questions:

  1. Comment puis-je vous assurer que les Form Je veux faire actif est le seul qui est actif?

  2. Relier à ce qui précède; définir un formulaire comme actif en utilisant form.Activate() devrait désactiver les autres MdiChildren, mais ce n'est pas - comment puis-je désactiver les autres fenêtres dans le code?

Merci pour votre temps.

+0

Votre première question me trouble ... dans quel scénario y a-t-il plus d'un enfant actif? Le comportement de MDI est de faire exactement ce que vous voulez afin que tout autre comportement semble artificiel. – DonBoitnott

+0

Je peux ouvrir plus d'un classeur Excel, ce qui me permet d'avoir plusieurs enfants mdi actifs à la fois. L'utilisateur peut les activer comme il le souhaite via un bouton (alignement horizontal, ou quoi que ce soit). Je pose les éléments et je veux restaurer la fenêtre active après l'opération de mise en page. Maintenant, pour une raison quelconque, lorsque je fais cela, j'ai deux fenêtres actives, la dernière que j'ai déplacée par programme et celle que j'ai définie après l'opération. 'form.Active()' devrait mettre 'form' comme actif et par le comportement par défaut, les autres devraient désactiver, cela ne se produit pas. Pourquoi? – MoonKnight

+0

J'ai maintenant un problème avec 'C1Ribbon' et un formulaire MDI que je suspecte est dû à leur utilisation de' DoEvents() '. Pourriez-vous développer ce que vous avez trouvé qui vous causait des problèmes? – DonBoitnott

Répondre

1

[Trop long pour un commentaire]

Je suis malade aux dents postérieures avec C1 combat. Esp. le ruban. J'ai confirmé avec leur support qu'ils utilisent DoEvents() qu'ils utilisent pour générer leurs threads Gui. Je vais maintenant passer à DevExpress qui devrait être simple pour mon application MVC ...

L'utilisation de C1 de DoEvents() perturbe le flux normal de votre application. DoEvents() est asynchrone, ce qui signifie qu'il se termine avant que l'application n'ait traité les événements en attente, donc si vous l'utilisez dans une procédure avec plusieurs instructions séquentielles, l'appel DoEvents() provoque une énorme perturbation à chaque appel. C'est ce que je pense que nous voyons quand nous effectuons nos opérations MDI, mais nous ne pouvons jamais être sûrs sans le code source C1.

J'espère que cela aide.