2009-12-10 15 views
5

c'è un modo per ottenere un evento Load per System.Windows.Forms.Control proprio come System.Windows.Forms.Form.Load?Aggiungere un evento Load per Winforms Control come classe Form

Desidero eseguire un codice di inizializzazione prima che venga visualizzato per primo il controllo.

Inoltre, sarebbe bello poter fare lo stesso per System.Windows.Forms.ToolStripStatusLabel che non è in realtà un controllo, ma funziona come uno.

Idealmente, posso farlo: control.OnLoad (() => {dosomething here;});

in cui OnLoad è un metodo di estensione che eseguirà l'argomento Azione quando il "controllo" "Carica".

Grazie!

risposta

4

Form.Load evento viene chiamato dal metodo OnLoad che è chiamato dal metodo OnCreateControl che appartiene alla classe Control. Così, per la forma la sequenza di chiamata sarebbe seguente:

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

Credo che si può ignorare OnCreateControl per il componente e aggiungere il codice di ottimizzazione lì.

Spero che questo aiuti, saluti.

+0

Grazie per il vostro suggerimento. Seguito il tuo consiglio ho trovato l'evento CreateControl della classe Control. C'è qualcosa di simile nella classe ToolStripItem? – deerchao

+0

Stai cercando di creare un nuovo discendente ToolStripItem? Immagino che tu possa inserire il codice di inizializzazione nel suo contructor –

+0

No, non posso perché il codice ha qualcosa a che fare con il suo genitore: il controllo ToolStrip. nel costruttore, sarebbero nulli. – deerchao

4

Per un controllo è possibile eseguire l'override di OnControlCreated o OnHandleCreated. Quest'ultimo può sparare più volte se è necessario ricreare la finestra di controllo. Assicurati di usarlo se il tuo codice influenza la finestra stessa. In altre parole, se fai qualcosa che richiede la proprietà Handle.

Poche scelte adatte per un controllo derivato da ToolStripItem. Ti consigliamo di eseguire l'override di SetVisibleCore() o OnAvailableChanged() o dell'evento AvailableChanged. Eseguono quando cambia la proprietà Visible di ToolStripItem. Fai attenzione che potrebbe sparare più volte, tieni un campo bool che tiene traccia del codice di inizializzazione già eseguito.

Ultimo ma non meno importante, assicurati di eseguire solo questa operazione se il tuo codice richiede effettivamente la creazione del controllo. La stragrande maggioranza del codice di init può andare nel costruttore. Hai solo bisogno di un evento Load se il tuo codice dipende dalla posizione attuale e dalla dimensione del controllo. Quale potrebbe essere diverso dal valore del progettista se il modulo si ridimensiona a causa di un diverso carattere di sistema o impostazione DPI video sul computer di destinazione.

+0

Grazie. L'ho provato, ma non funzionava come mi aspettavo. L'evento VisibleChanged/AvailableChanged si attiva quando GetCurrentParent() è null. – deerchao

0

Avevo bisogno di una soluzione come questa per un TabPage all'interno di un TabControl. L'unica cosa che mi è venuta in mente era usare il gestore di eventi paint. Ho aggiunto il gestore di eventi per Paint e nella prima riga rimuovo il gestore di eventi e poi faccio più codice di inizializzazione. Funziona solo se non hai alcun dipinto personalizzato. In alternativa, se devi fare un disegno personalizzato puoi aggiungere un flag per verificare ogni volta che Paint Executes.

//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 
} 
Problemi correlati