2010-12-13 20 views
0

私は自分のフォームを通して複数のインスタンスを使用するユーザーコントロールのグループを持っています。 usercontrolsには、テキストボックス、コンボボックス、またはチェックボックスのいずれかと、そのコントロールの値を返すget valueメソッドが含まれています。通常、私はクリックされたイベントがusercontrols getValue関数を呼び出すフォーム上のボタンを持っていますが、usercontrolsコントロールが変更されたイベントが発生するたびにフォーム上で何かが発生する必要があります。次のようなものForm1.csのユーザコントロールのイベントを購読するにはどうすればいいですか

form1.Controls.Add(UserControl1); 
form1.Controls.Add(UserContorl2); 
// gets called every time the combobox on UserControl1 has it's 
// ValueChanged event raised 
private void UserControl1_Changed(object Sender, EventArgs e) 
{ 
    form1.property1 = UserControl1.getValue(); 
} 
// gets called everytime the textbox on UserControl2 has it's 
// textChanged event raised 
private void UserControl2_Changed(object Sender, EventArgs e) 
{ 
    form1.property2 = UserControl2.getValue(); 
} 

で 私は/スロー形でそのイベントをキャッチする方法を見つけ出すことはできません。私はVS 2005を使用しています。

ここに私のユーザーコントロールの1つのコードです。 txtValueには、以下が含まれるようにコントロールを更新し、テキストボックス

public partial class StringParameterControl : BaseParameterControl 
{ 
    public StringParameterControl(string aName, string aValue) 
     : base(aName) 
    { 
     InitializeComponent(); 
     txtValue.Text = aValue; 
    } 
    public StringParameterControl(string aName) 
     : base(aName) 
    { 
     InitializeComponent(); 
    } 
    public StringParameterControl() 
     : base() 
    { 
     InitializeComponent(); 
    } 
    public void SetValue(string aValue) 
    { 
     txtValue.Text = aValue; 
    } 
    public override object GetValue() 
    { 
     return txtValue.Text; 
    } 
} 

答えて

2
UserControl1.Changed += UserControl1_Changed; 

です:

// A delegate type for hooking up change notifications. 
// This is _what kind_ of event you want. It sets the signature your event handler methods must have. 
public delegate void ChangedEventHandler(object sender, EventArgs e); 

//the actual event 
public event ChangedEventHandler Changed; 

// Method to raise/fire the Changed event. Call this whenever something changes 
protected virtual void OnChanged(EventArgs e) 
{ 
    ChangedEventHandler handler = Changed; 
    if (handler != null) handler(this, e); 
} 

//and update your existing SetValue() function like so: 
public void SetValue(string aValue) 
{ 
    txtValue.Text = aValue; 
    OnChanged(EventArgs.Empty); 
} 

あなたは、たとえば古いかをあなたが—をしたい任意の情報を渡すためにあなたのイベントの署名を変更することができますプロパティの新しい値(またはその両方)。私は例の標準的なイベント引数を使用しました。

話すかプロパティでは、C#で別のGet/Setメソッドを記述しないでください。あなた自身がそれをやって見つけた場合、あなたはおそらくどの自動的に正しい取得/設定のセマンティクスを強制されます、代わりにプロパティを使用したい:

public string Value 
{ 
    get { return txtValue.Text;} 
    set {txtValue.Text = value; OnChanged(EventArgs.Emtpy); } 
} 
+0

あなたのusercontrolに依存するUserControl – scott

+0

@scottの中で、Changedはどのように見えますか? –

+0

私のユーザーコントロールのコードを追加しました – scott

0

を限り、私はあなたがいつでもイベントを発生していない使用しているユーザーコントロールを理解して自分のValueChangedイベントを購読することはできません。 usercontrolsの "Controls"コレクションに興味のあるコントロール(Combobox、Textboxなど)を見つけ、適切なイベントに直接購読することができます。

+0

したがって、コントロールの値が変更されたときに、usercontrolにイベントを発生させるのが最も簡単な方法のようです。どうすればいい? – scott

0

または、型推論スタイルで行うことができます。

 UserControl.Changed = (sender, e) => this.controlFired = true; //or whatever 

変更を使用すると、デリゲートの種類(無効(オブジェクト送信者、EventArges電子))を使用してコントロールのプロパティを介して公開する公開イベントです。あなたはmsdnでイベントを公開する方法を調べることができます - そこにはたくさんの記事があります。

関連する問題