2011-10-24 13 views
49

私はカスタムのusercontrolを持っていて、私は比較的簡単なことをしたい。Usercontrolでイベントを作成し、メインフォームにハンドリングさせるにはどうすればよいですか?

ユーザーコントロールの値が変更されたときに、メインフォームに表示ウィンドウを更新させるようにします。

NUDがユーザーコントロールにない場合は問題はありませんが、usercontrolではなくメインフォームによってイベントを処理する方法を把握できていないようです。

+1

可能重複変更(http://stackoverflow.com [Winformsのをユーザーがカスタムイベントを制御します]/questions/2188059/winforms-user-controls-custom-events) –

答えて

100

ユーザーコントロール内のイベントが発生したときに発生するユーザーコントロール用のイベントハンドラを作成する必要があります。これにより、フォームからイベントを処理できるように、イベントをチェーン上にバブリングすることができます。

ユーザーコントロール上のButton1をクリックすると、私は、フォーム上のUserControl_ButtonClickをトリガーButton1_Clickを発射ます:

ユーザーコントロール:

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);    
} 

フォーム:

UserControl1.ButtonClick += new EventHandler(UserControl_ButtonClick); 

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

私は編集できませんが、 '' UserControl1.OnButtonClick''を '' UserControl1.ButtonClick''に変更しますか? –

+0

非常に便利、thaks –

+1

フォームのコードを編集してください: 'OnButtonClick'の代わりに' ButtonClick' – ThunderWiring

15

はそれをマッピングしてみます。あなたのUserControlにこのコードを配置してみてください。

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

、あなたのUserControlはあなたが正常にNumericUpDown制御で見るValueChangedイベントを持っています。あなたは例の下.....次のように行うことができます

+1

* new *キーワードはここでは使用しないでください。 –

10

は、テキストボックス(ユーザーコントロール)の値を示しているの

// 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)); 
    }  
} 
関連する問題