2014-12-15 12 views
5

Poiché non ho molta reputazione per pubblicare immagini, sto elaborando come una grande domanda.Come limitare gli eventi che si attivano più di una volta alla volta

Ho tre finestre in cui l'esecuzione degli eventi aumenta ogni volta che il modulo viene creato.

1. Form1 (MainForm)

Qui chiamate il secondo modulo (SubForm) che contiene un controllo utente.

2. Form2 (SubForm)

Qui mi chiamano la seconda forma (ChildForm) facendo clic il controllo utente.

3. Form3 (ChildForm)

Esso contiene un pulsante OK.

Ecco il mio problema.

  • Per prima cosa apro MainForm e faccio clic sul pulsante per aprire il secondo modulo (Sottoforma).
  • Ora in seconda forma (SubForm) Faccio clic sul controllo utente che mostra il terzo modulo (ChildForm).
  • Quando faccio clic sul pulsante OK nel terzo modulo, il modulo viene chiuso.
  • Ora chiudo il secondo modulo (SubForm) senza chiudere il primo modulo (modulo principale) e fare clic sul pulsante nel primo modulo (MainForm) per aprire nuovamente il secondo modulo (Sottoforma).
  • Ora faccio clic sul controllo utente nel secondo modulo (SubForm) e viene aperto il terzo modulo (ChildForm).
  • Ora, quando faccio clic su OK nel terzo modulo (ChildForm), l'evento nel secondo modulo (SubForm) viene generato nuovamente e il terzo modulo (ChildForm) viene aperto quattro volte.
  • Ora, quando chiudo la seconda forma (SubForm) di nuovo e fa clic il controllo utente e prendere terza forma (ChildForm), la terza forma (ChildForm) viene aperto tre volte ecc ecc

Ecco il codice in prima forma (MainForm)

private void button1_Click(object sender, EventArgs e) 
{ 
    SubForm obj = new SubForm();  
    obj.ShowDialog(); 
} 

Ecco il codice a seconda forma (SubForm) che contiene controllo utente

// Event generation 
UserControl1.MouseUp += new EventHandler(this.Node_Click); 

// Event that calls the ChildForm 
private void Node_Click(object sender, EventArgs e) 
{ 
     ChildForm obj = new ChildForm();  
     obj.ShowDialog();     
} 

Ecco il codice in prima forma (Ma inForm)

private void btnOK_Click(object sender, EventArgs e) 
{ 
    this.Close(); 
} 

Qualcuno sa perché questo sta accadendo?

+0

Dove si verifica l'assegnazione di eventi 'MouseUp'? – DonBoitnott

+1

Dove ci si abbona a 'UserControl1.MouseUp + = new EventHandler (this.Node_Click);'? Se ti iscrivi più volte, l'evento verrà generato più volte. –

risposta

1

Dato che chiami UserControl1.MouseUp, penso che tu abbia dichiarato l'evento come static. Quindi, anche se chiudi il secondo modulo (mantenendo la prima forma non chiusa), l'evento non viene cancellato. Per questo è necessario Unsubscribe l'evento.

Utilizzare l'evento Form_Closing nel secondo modulo per Unsubscribe l'evento.

private void SubForm_FormClosing(object sender, FormClosingEventArgs e) 
{ 
    UserControl1.MouseUp -= new EventHandler(this.Node_Click); 
} 
+0

Funzionante. Grazie @Sarath Avanavu –

2

Hey non sono sicuro di cosa stia succedendo, ma se vuoi che il nodo_click venga applicato solo una volta basta dichiarare un bool var canEnter = true; e fare questo

private void Node_Click(object sender, EventArgs e) { 
    if(canEnter) { 
      ChildForm obj = new ChildForm();  
      obj.ShowDialog();  
canEnter=false; 
} 
      } 

e rendere evento per il form figlio (evento a porte chiuse) e posto in esso canEnter = true; se ho capito bene, suppongo che sia quello che devi fare :)

Problemi correlati