より良い方法...
すべきことは、コンテナーがサブスクライブするユーザー コントロールでカスタム イベントを作成することです。ボタン イベントをサブスクライブするのと非常によく似ていますが、これだけがカスタム コントロールです。このイベントはコンテナに情報を渡します。コンテナは、div を表示する必要があるかどうかなど、必要なものを識別することができます。
次のようになります。
protected void Page_Load(object sender, EventArgs e)
{
this.myuserControl.Update += new MyUserControlUpdateEventHandler(myuserControl_Update);
}
void myuserControl_Update(object sender, MyuserControlEventArgs e)
{
this.parentDiv.visible = !e.ShouldHideUI;
}
このメソッドは、親をユーザー コントロールから切り離します。つまり、ユーザー コントロールは、親のコントロールのすべてを認識している必要はなく、また、そうすべきでもありません。
興味がある方のために、ユーザー コントロールがそのようなイベントを定義する方法の大まかな例を次に示します。
public class MyuserControlEventArgs : EventArgs
{
public bool ShouldHideUI { get;set;}
public MyuserControlEventArgs (bool shouldHideUI)
{
this.ShouldHideUI = shouldHideUI;
}
}
public delegate void MyUserControlUpdateEventHandler(object sender, MyuserControlEventArgs e);
public event MyUserControlUpdateEventHandler Update;
protected void OnUpdate(MyuserControlEventArgs e)
{
if (Update!= null)
Update(this, e);
}
サブスクライバーがそれについて知る必要があると感じたときはいつでも、ユーザー コントロールは OnUpdate を呼び出すだけで済みます。
クイック&ダーティな方法...
素早く汚いものが必要な場合は、これを試してください(ユーザーコントロール内で):
TheParentControl parentControl = (TheParentControl)this.Parent;
parentControl.ParentDiv.Visible = true;
重要なのは、適切な型にキャストして(明らかに、ユーザー コントロールは親の型を認識しているはずです)、親のプロパティを設定することです。div を親コントロールのプロパティとして公開する場合があります。親は、ユーザー コントロールが存在するコントロール コレクションを持つ任意のコントロール (ページ、FooControl、BarControl など) である可能性があることに注意してください。FindControl()
親へのハンドルを取得すると、名前でコントロールを見つけることさえできます。