web-dev-qa-db-ja.com

ASP.NET Webサイト(Webアプリケーションではない)のユーザーコントロールから親ページを取得する方法

主題が尋ねるように。

編集1

リクエストの処理中に、ユーザーコントロールに親ページへの参照を保存することはできますか?

30
JoeB
this.Page

またはどこからでも:

Page page = HttpContext.Current.Handler as Page
62
Paul Alexander

ユーザーコントロールはそのコンテキストを知らず、どのページが表示されていても予測どおりに動作する必要があるため、ユーザーコントロールがそのページについて何かを知る正当な理由は考えられません。

そうは言っても、 this.Page

14
Andrew Hare

parentプロパティを使用できます

ページ上のコントロールを見つけるためにこれが必要な場合は、使用できます

Label lbl_Test = (Label)Parent.FindControl("lbl_Test");
7
Josh Mein

System.Web.UI.UserControlでthis.Pageを常に使用していました。

または、ページであるオブジェクトに遭遇するまで、親に対して常に再帰呼び出しを行うことができます。

ちょっとやり過ぎ...

protected Page GetParentPage( Control control )
{
    if (this.Parent is Page)
        return (Page)this.Parent;

    return GetParentPage(this.Parent);
}
2
BigBlondeViking

これを行う方法は、インターフェイスを作成し、そのインターフェイスを実装し、this.Pageを使用してコントロールからページを取得し、インターフェイスにキャストしてからメソッドを呼び出すことであることがわかりました。

2
JoeB

次のようにNamingContainerを使用する必要があります。

       try
        {
            if (!string.IsNullOrWhiteSpace(TargetCtrlID))
            {
                var ctrl = NamingContainer.FindControl(TargetCtrlID);
                if(ctrl != null)
                    Console.Write("'" + ctrl.ClientID + "'");
            }
        }
        catch
        {

        }
1
Hakan KOSE

すべてのコントロールには、親にアクセスするために使用できる親プロパティがあります。

protected void Page_Load(object sender, EventArgs e)
{
  Response.Write(this.Parent.ID);
}

編集:参照を保存するページのライフサイクルイベントの1つと、その参照の保存に使用するものによって異なります。ただし、参照は常に利用可能です

0
Marco Mangia

Webユーザーコントロールからページおよびマスターページへの書き込み:個人的には、ユーザーコントロールがゆるいのが好きですが、次のようにできます。

マスターページ:

public partial class Second : System.Web.UI.MasterPage
    {
        public void SecondMasterString(string text)
        {
            MasterOut.Text += text;
        }
    }

WebForm1に必要なディレクティブ:したがって、ページはマスターページに書き込むことができます

<%@  MasterType VirtualPath="~/DemoFolder/MasterPages/Second.master" %>

メソッドはページおよびマスターページに書き込みます。

public partial class WebForm1 : System.Web.UI.Page
    {
    public void SetPageOutput(string text)
        {
            // writes to page
            this.PageOut.Text = text;
        }

        public void SetMaster(string text)
        {
            // writes to Master Page
            this.Master.SecondMasterString(text);
        }
}

ユーザーコントロールは、ページとマスターページの両方に書き込みます。

public partial class WebUserControl1 : System.Web.UI.UserControl
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            LegoLand.DemoFolder.MasterPages.WebForm1 page = (WebForm1)this.Parent.Page;
            page.SetMaster("** From the control to the master");
            page.SetPageOutput("From the control to the page");
        }
    }
0
Stewart

ユーザーコントロールでデリゲートを作成し、親ページからメソッドを割り当てます。

class MyUserControl : UserControl
{
   delegate object MyDelegate(object arg1, object arg2, object argN);
   public MyDelegate MyPageMethod;

   public void InvokeDelegate(object arg1, object arg2, object argN)
   {
     if(MyDelegate != null)
        MyDelegate(arg1, arg2, argN); //Or you can leave it without the check 
                                      //so it can throw an exception at you.
   }
}

class MyPageUsingControl : Page
{
   protected void Page_Load(object sender, EventArgs e)
   {
     if(!Page.IsPostBack)
        MyUserContorlInstance.MyPageMethod = PageMethod;
   }

   public object PageMethod(object arg1, object arg2, object argN)
   {
     //The actions I want
   }
}
0
Nikolay