6
votes

Ajoutez un événement de chargement pour le contrôle WinForms comme classe de formulaire

Y a-t-il un moyen de recevoir un événement de charge pour System.Windows.Forms.Control comme System.Windows.Forms.Form.load?

Je veux exécuter du code initialize avant le contrôle d'abord montré.

En outre, il serait bien de pouvoir faire la même chose pour System.Windows.Forms.ToolStripStatusLabel qui n'est pas un contrôle, mais fonctionne comme un.

Idéalement, je peux le faire: Control.Onload (() => {Dosomething Ici;});

dans lequel online est une méthode d'extension qui exécuterait l'action d'argument lorsque le "contrôle" "charge".

Merci!


0 commentaires

3 Réponses :


8
votes

form.load code> L'événement est appelé par la méthode code> ulto oneload code> à partir de la méthode OnCreateControl code> méthode appartenant au contrôle / code> classe. Donc, pour le formulaire, la séquence appelante suivrait:

OnCreateControl start
  OnLoad start
      Form Load event call
  OnLoad finish
OnCreateControl finish


4 commentaires

Merci pour votre conseil. Suivi de vos conseils, j'ai trouvé CreateControl événement de classe de contrôle. Y a-t-il quelque chose comme celui-ci dans la classe Toolstripitem?


Essayez-vous de créer un nouveau descendant ToolStripitem? Je suppose que vous pouvez mettre le code d'initialisation dans son contruceur


Non, je ne peux pas parce que le code a quelque chose à voir avec son parent: le contrôle de la boîte à outils. Dans le constructeur, ils seraient nuls.


Vous pouvez utiliser la méthode ONOWNERCHANGED (EventArgS e) pour suivre le changement de propriété propriétaire; et OnparentChanged (Toolstrip Oldparent, Toolstrip NEWPARENT) pour gérer le changement de contrôle des parents. Les deux devraient être appelés lorsque ToolStripitem est ajouté à la collection Statusstrip Control Items



5
votes

Pour un contrôle, vous pouvez remplacer l'onControlCreated ou OntionLecreated. Ce dernier peut tirer plusieurs fois s'il est nécessaire de recréer la fenêtre de contrôle. Assurez-vous de l'utiliser si votre code affecte la fenêtre elle-même. En d'autres termes, si vous faites tout ce qui nécessite la propriété de la poignée.

Peu de choix appropriés pour un contrôle dérivé de Toolstripitem. Je recommanderais de remplacer SetVisiblecore () ou OnavailableChanged () ou l'événement disponible. Ils fonctionnent lorsque la propriété visible de l'outilstripitem change. Méfiez-vous qu'il peut tirer plusieurs fois, gardez un champ BOOL qui suit que votre code d'initialisation est déjà exécuté.

Dernier point mais non le moindre, assurez-vous de ne faire que si votre code nécessite réellement le contrôle de la création. La vaste majorité du code init peut aller dans le constructeur. Vous n'avez besoin que d'un événement de charge si votre code dépend de l'emplacement et de la taille réels du contrôle. Qui pourrait être différente de la valeur de concepteur si le formulaire se répète en raison d'une police système différente ou d'un paramètre vidéo DPI vidéo sur la machine cible.


1 commentaires

Merci. Je l'ai testé, mais ne travaille pas comme si j'attendais. L'événement visibléchant / disponibilité incendie lorsque leur getCurrentparent () est null.



0
votes

J'avais besoin d'une solution comme celle-ci pour un Tabpage code> dans un Tabcontrol code> .La seule chose que je suis arrivée était d'utiliser le gestionnaire d'événements de peinture. J'ai ajouté le gestionnaire d'événements pour la peinture et dans la première ligne, je supprimais le gestionnaire d'événements, puis effectuez plus de code d'initialisation. Cela ne fonctionne que si vous n'avez pas de peinture personnalisée. Sinon, si vous avez besoin de faire une peinture personnalisée, vous pouvez ajouter un drapeau pour vérifier chaque fois que la peinture est exécutée.

//Paint only runs once    
private void tabPage1_Paint(object sender, PaintEventArgs e)
{
    tabPage1.Paint -= tabPage1_Paint;    
    //Do initialization here    
}

/////////////////////////////////////////////////////////////////////////////////

//Paint always runs

private bool IsFirstPaint = true;

private void tabPage1_Paint(object sender, PaintEventArgs e)    
{    
    if(IsFirstPaint)
    {
        IsFirstPaint = false;    
        //Do initialization here
    }    
    //Do custom painting here
}


0 commentaires