2009-08-15 18 views
4

私はこれを正しい方法でやっているのか不思議でした。私は親フォームと子フォームの2つのフォームを持っています(オプションダイアログ)。私は私のフォーム上の1つのリッチテキストボックスを持っている親フォームのプロパティを子フォームから変更する正しい方法は何ですか?

// Create an array of all rich textboxes on the parent form. 
var controls = this.Owner.Controls.OfType<RichTextBox>(); 

foreach (var item in controls) { 
    if (chkDetectUrls.Checked) 
     ((RichTextBox)item).DetectUrls = true; 
    else 
     ((RichTextBox)item).DetectUrls = false; 
} 

:私はこのようなコードを使用して、私の子フォームから私の親フォームでプロパティを変更します。 1つのコントロールの配列をループしなければならないのは馬鹿馬鹿しいようです。これは正しい方法ですか、それとも簡単な方法ですか?

答えて

9

親フォームのプロパティを変更することはまったく適切ではありません。代わりに、親フォームがリッスンするイベントを発生させ、それに応じて独自の値を変更する必要があります。

子フォームから親フォームを操作すると双方向結合が作成されます。親フォームは子フォームを所有していますが、子フォームは親フォームに対して親密な知識と依存関係も持っています。バブルは、厳密な結合を避けながら、情報が上向きに(「バブリング」)流れるようにするため、これに対する確立された解決策です。

ここでは、イベントの最も基本的な例を示します。このイベントには特定の情報を渡すことは含まれていません(これはあなたが必要とするかもしれませんが)。

//the event 
public event EventHandler SomethingHappened; 

protected virtual void OnSomethingHappened(EventArgs e) 
{ 
    //make sure we have someone subscribed to our event before we try to raise it 
    if(this.SomethingHappened != null) 
    { 
     this.SomethingHappened(this, e); 
    } 
} 

private void SomeMethod() 
{ 
    //call our method when we want to raise the event 
    OnSomethingHappened(EventArgs.Empty); 
} 

そして、あなたの親フォームで:あなたの子フォームで

void OnInit(EventArgs e) 
{ 
    //attach a handler to the event 
    myChildControl.SomethingHappened += new EventHandler(HandleSomethingHappened); 
} 

//gets called when the control raises its event 
private void HandleSomethingHappened(object sender, EventArgs e) 
{ 
    //set the properties here 
} 

私は上記の言ったように、あなたはおそらく、あなたの場合には、いくつかの特定の情報を渡す必要があります。これを行うにはいくつかの方法がありますが、最も簡単な方法は独自のEventArgsクラスと独自のデリゲートを作成することです。あなたには、いくつかの値をtrueまたはfalseに設定されているかどうかを指定する必要があるように見えますので、のはそれを使ってみましょう:

public class BooleanValueChangedEventArgs : EventArgs 
{ 
    public bool NewValue; 

    public BooleanValueChangedEventArgs(bool value) 
     : base() 
    { 
     this.NewValue = value; 
    } 
} 

public delegate void HandleBooleanValueChange(object sender, BooleanValueChangedEventArgs e); 

我々は、これらの新しい署名を使用するために私たちのイベントを変更することができます。

public event HandleBooleanValueChange SomethingHappened; 

そして、我々は合格します私たちのカスタムのEventArgsは、オブジェクト:

bool checked = //get value 
OnSomethingHappened(new BooleanValueChangedEventArgs(checked)); 

そして、我々はそれに応じて、親に取り扱い、当社のイベントを変更:

void OnInit(EventArgs e) 
{ 
    //attach a handler to the event 
    myChildControl.SomethingHappened += new HandleBooleanValueChange(HandleSomethingHappened); 
} 

//gets called when the control raises its event 
private void HandleSomethingHappened(object sender, BooleanValueChangedEventArgs e) 
{ 
    //set the properties here 
    bool value = e.NewValue; 
} 
+0

私はC#の初心者です。簡単な例やリンクを教えてください。 ;-) –

+0

ありがとうございます。あなたが何を言っているのかが本当に分かりました。 –

+0

あなた自身のデリゲート型を作る代わりに 'EventHandler 'を使うこともできます。これは論理的にイベントハンドラデリゲートとしてマークします。 –

関連する問題