Exécuter code du composant juste avant ou après l'événement Form_Load dans .NET WinForms?

StackOverflow https://stackoverflow.com/questions/2265776

  •  20-09-2019
  •  | 
  •  

Question

J'ai un composant qui est en conflit avec un autre composant qui gère certaines traductions internes.

Qu'est-ce qui se passe est que les composants de logique métier est exécuté, le système de traduction exécute, qui reprend des textes maintenant présents dans la forme, et tente de les traduire.

Le problème est que le texte contient maintenant des choses comme des chiffres, des dates, des textes liés à la base de données, etc., mais avant la logique métier a été exécuté, ces contrôles était vide ou contenait-faux texte préparé pour la traduction.

Je me demande comment je peux avoir une composante que je laisse tomber sur un formulaire d'exécuter son code à un moment précis dans la vie de la forme.

Par exemple, si je retire le code incriminé de la composante de la logique métier, de sorte qu'il ne fait rien sur la construction, puis le travail de traduction, et si je l'appelle alors la méthode que je propose que le code à partir Form_Load, que trop fonctionne bien.

Je me demande, est pour moi il y a une certaine manière, d'un composant (ie. Descendant de

Était-ce utile?

La solution

Il est pas clair pour moi pourquoi vous ne pouviez pas résoudre simplement en appelant explicitement la méthode d'un composant à partir du gestionnaire d'événements Load du formulaire.

Faire un élément conscient de la forme sur laquelle il est tombé est possible. Le concepteur peut être cajolé pour initialiser une propriété du composant à l'instance de formulaire. Ceci est une technique utilisée par ErrorProvider par exemple, il peint les icônes d'erreur sur le formulaire. Cela pourrait ensuite être étendue à laisser la composante souscrire à 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...");
    }
  }
}
scroll top