2010-02-15 5 views
1

J'ai un composant en conflit avec un autre composant qui gère certaines traductions internes. Ce qui se passe, c'est que les composants de logique métier sont exécutés, puis le système de traduction s'exécute, qui récupère les textes présents dans le formulaire et tente de les traduire. Le problème est que le texte contient maintenant des éléments tels que des nombres, des dates, du texte lié à la base de données, etc. mais avant l'exécution de la logique métier, ces contrôles étaient vides ou contenaient du texte factice préparé pour la traduction. Je me demande comment je peux avoir un composant que je dépose sur un formulaire exécuter son code à un moment précis de la vie du formulaire. Par exemple, si je supprime le code incriminé du composant de logique applicative, afin qu'il ne fasse rien lors de la construction, puis la traduction fonctionne, et si j'appelle ensuite la méthode que j'ai déplacé ce code à partir de Form_Load, que aussi fonctionne bien.Exécuter du code de composant juste avant ou après l'événement Form_Load dans .NET WinForms?

Donc, je me demande, est-il un moyen pour moi, d'un composant (ie descendant de Component, pas un contrôle visuel), d'exécuter du code juste avant ou après Form_Load, ou au moins après tous les autres composants et les contrôles ont été mis en place?

Il ne semble pas y avoir de lien depuis l'intérieur du composant vers le formulaire, donc pour moi, accrocher dans l'événement Load ne semble pas possible non plus.

Ou est-ce que j'aboie le mauvais arbre?

Répondre

2

Je ne comprends pas pourquoi vous ne pouvez pas résoudre ce problème en appelant explicitement la méthode d'un composant à partir du gestionnaire d'événements Load du formulaire.

Rendre un composant conscient de la forme sur laquelle il est déposé est possible. Le concepteur peut être amené à initialiser une propriété du composant dans l'instance de formulaire. C'est une technique utilisée par ErrorProvider par exemple, il peint les icônes d'erreur sur le formulaire. Cela pourrait ensuite être étendu pour permettre au composant de s'abonner à l'événement Load du formulaire. Voici un exemple:

using System; 
using System.ComponentModel; 
using System.ComponentModel.Design; 
using System.Windows.Forms; 

namespace WindowsFormsApplication1 { 
    public partial class Component1 : Component { 
    public Component1() { 
     InitializeComponent(); 
    } 
    public Component1(IContainer container) { 
     container.Add(this); 
     InitializeComponent(); 
    } 

    [Browsable(false)] 
    public ContainerControl Host { 
     get { return mHost; } 
     set { 
     if (mHost == null && value as Form != null && !DesignMode) { 
      (value as Form).Load += Initialize; 
     } 
     mHost = value; 
     } 
    } 
    private ContainerControl mHost; 

    public override ISite Site { 
     set { 
     base.Site = value; 
     if (value != null) { 
      // Assign Host at design time 
      IDesignerHost service = value.GetService(typeof(IDesignerHost)) as IDesignerHost; 
      if (service != null) { 
      IComponent rootComponent = service.RootComponent; 
      this.Host = rootComponent as ContainerControl; 
      } 
     } 
     } 
    } 
    private void Initialize(object sender, EventArgs e) { 
     Console.WriteLine("initializing..."); 
    } 
    } 
} 
+0

Nous avons déjà beaucoup de formes, j'espérais éviter de revenir et l'ajout de code à tous pour résoudre ce problème, mais il semble la manière la plus correcte pour résoudre ce problème est en le faisant. Je vais regarder dans le code que vous avez posté. –

+0

Le code que vous avez posté a résolu les problèmes. Pour les formulaires existants, je dois revenir en arrière et définir manuellement la propriété Host, et avec le code que vous avez posté, les nouveaux formulaires seront corrigés automatiquement. Merci! –

Questions connexes