2

ASP .NET Webユーザーコントロール(ascx)のコードビハインド内から、その親であるdiv要素へのアクセスを(実行時に)取得する必要があります。目的は、言及された親divの可視性を変更するだけです。

Webページのコードの多くに触れることができないため、ユーザーコントロールのコードの変更のみを必要とするソリューションが必要になります。

したがって、WebページのコードのHTML「部分」には次のようなものがあります。

<div id="parentDIV" runat="server">
    <uc:MyUserControl ID="myUserControlInstance" runat="server" />
</div>

次のようなユーザーコントロールの背後にあるコードで実行したいと思います。

this.Container.Visible = false;

私はそれが良い習慣であるかどうかを尋ねていないことに注意してください。

編集: 背後にあるユーザー制御コードは、親DIVのIDについて「認識」していません。

4

5 に答える 5

2

私はそれをクライアントに隠します。「awesomeUserControl」のようなクラスでユーザーコントロールコンテナ(div?)を装飾します。次に、ScriptManagerオブジェクトを使用してjavascriptを発行し、次のように親を非表示にします。

ScriptManager.RegisterStartupScript(this、this.GetType()、 "HideMyAwesomeUserControl"、 "$('。awesomeUserControl')。parent()。hide();"、true);

于 2012-06-12T19:14:59.777 に答える
1

より良い方法...

すべきことは、コンテナーがサブスクライブするユーザー コントロールでカスタム イベントを作成することです。ボタン イベントをサブスクライブするのと非常によく似ていますが、これだけがカスタム コントロールです。このイベントはコンテナに情報を渡します。コンテナは、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()親へのハンドルを取得すると、名前でコントロールを見つけることさえできます。

于 2012-06-12T18:06:25.473 に答える
0

何かが足りないのですか、ユーザー コントロールと aspx ページがあるようです (どちらにもコード ビハインドがあります)。ユーザー コントロールは、div でラップされた aspx ページに追加されたように見えます。div コントロールをサーバーで実行するようにしました (ただし、これは htmlcontrol を介して実行できます)。div を管理するために必要なことは次のとおりです。

parentDIV.visible = false;

またはdivで行う必要があることは何でも。

UC コード ビハインドが APSX ページ DIV について知る必要があるのはなぜですか。

于 2013-07-17T16:26:32.623 に答える
0

あなたはほとんどそこにいます....

this.Parent.Visible = false;
于 2012-06-12T18:02:02.320 に答える
0

すべてのコントロールがレンダリングされると、HTML以下のように親子コントロールを決定できます。

while ループを使用しているため、他の中間コントロールを追加した場合、クラッシュや予期しない結果が発生しない可能性があります。

public Control ParentControl
{
    get
    {
        Control ctl = this.Parent;
        while (true)
        {
            if (ctl == null) break;
            if (ctl.ID.Equals("parentDIV"))
            {
                break;
            }
            ctl = ctl.Parent;
        }
        return ctl;
    }
}

if(ParentControl != null)
    ParentControl.Visible = true|false;
于 2012-06-12T18:05:42.257 に答える