2011-10-24 10 views
49

Ho un usercontrol personalizzato e voglio fare qualcosa di relativamente semplice.Come posso creare un evento in Usercontrol e averlo gestito nel modulo principale?

Se mai un valore numerico al di sotto del valore di quell'usercontrol cambia, fare in modo che il modulo principale aggiorni una finestra di visualizzazione.

Questo non è un problema se il NUD non era in un controllo elettronico, ma non riesco a capire come avere l'evento gestito dalla mainform e non dall'usercontrol.

+1

possibile duplicato del [WinForms utente controlla gli eventi personalizzati] (http://stackoverflow.com/questions/2188059/winforms-user-controls-custom-events) –

risposta

100

È necessario creare un gestore eventi per il controllo utente che viene generato quando viene attivato un evento all'interno del controllo utente. Ciò ti consentirà di far comparire l'evento sulla catena in modo da poter gestire l'evento dal modulo.

Cliccando Button1 sul UserControl, io ti sparo Button1_Click che innesca UserControl_ButtonClick sul modulo: controllo

utente:

public event EventHandler ButtonClick; 

protected void Button1_Click(object sender, EventArgs e) 
{ 
    //bubble the event up to the parent 
    if (this.ButtonClick!= null) 
     this.ButtonClick(this, e);    
} 

Forma:

UserControl1.ButtonClick += new EventHandler(UserControl_ButtonClick); 

protected void UserControl_ButtonClick(object sender, EventArgs e) 
{ 
    //handle the event 
} 
+3

Non riesco a fare la modifica, ma cambier '' UserControl1.OnButtonClick'' a '' UserControl1.ButtonClick''? –

+0

molto utile, thaks –

+1

si prega di modificare il codice del modulo: 'ButtonClick' invece di' OnButtonClick' – ThunderWiring

15

provare a mappare esso. Prova a mettere il codice nel tuo UserControl:

public event EventHandler ValueChanged { 
    add { numericUpDown1.ValueChanged += value; } 
    remove { numericUpDown1.ValueChanged -= value; } 
} 

allora il vostro UserControl avrà l'evento ValueChanged normalmente si vede con il controllo NumericUpDown.

+1

Non utilizzare la * nuova * parola chiave qui. –

10

si può fare in questo modo ..... L'esempio seguente mostra casella di testo valore (controllo dell'utente) ha cambiato

// Declare a delegate 
public delegate void ValueChangedEventHandler(object sender, ValueChangedEventArgs e); 
public partial class SampleUserControl : TextBox 
{  
    public SampleUserControl() 
    { 
     InitializeComponent(); 
    } 

    // Declare an event 
    public event ValueChangedEventHandler ValueChanged; 

    protected virtual void OnValueChanged(ValueChangedEventArgs e) 
    { 
     if (ValueChanged != null) 
      ValueChanged(this,e); 
    }  
    private void SampleUserControl_TextChanged(object sender, EventArgs e) 
    { 
     TextBox tb = (TextBox)sender; 
     int value; 
     if (!int.TryParse(tb.Text, out value)) 
      value = 0; 
     // Raise the event 
     OnValueChanged(new ValueChangedEventArgs(value)); 
    }  
} 
Problemi correlati