親フォームのプロパティを変更することはまったく適切ではありません。代わりに、親フォームがリッスンするイベントを発生させ、それに応じて独自の値を変更する必要があります。
子フォームから親フォームを操作すると双方向結合が作成されます。親フォームは子フォームを所有していますが、子フォームは親フォームに対して親密な知識と依存関係も持っています。バブルは、厳密な結合を避けながら、情報が上向きに(「バブリング」)流れるようにするため、これに対する確立された解決策です。
ここでは、イベントの最も基本的な例を示します。このイベントには特定の情報を渡すことは含まれていません(これはあなたが必要とするかもしれませんが)。
//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;
}
私はC#の初心者です。簡単な例やリンクを教えてください。 ;-) –
ありがとうございます。あなたが何を言っているのかが本当に分かりました。 –
あなた自身のデリゲート型を作る代わりに 'EventHandler'を使うこともできます。これは論理的にイベントハンドラデリゲートとしてマークします。 –