主題が尋ねるように。
編集1
リクエストの処理中に、ユーザーコントロールに親ページへの参照を保存することはできますか?
this.Page
またはどこからでも:
Page page = HttpContext.Current.Handler as Page
ユーザーコントロールはそのコンテキストを知らず、どのページが表示されていても予測どおりに動作する必要があるため、ユーザーコントロールがそのページについて何かを知る正当な理由は考えられません。
そうは言っても、 this.Page
。
parentプロパティを使用できます
ページ上のコントロールを見つけるためにこれが必要な場合は、使用できます
Label lbl_Test = (Label)Parent.FindControl("lbl_Test");
System.Web.UI.UserControlでthis.Pageを常に使用していました。
または、ページであるオブジェクトに遭遇するまで、親に対して常に再帰呼び出しを行うことができます。
ちょっとやり過ぎ...
protected Page GetParentPage( Control control )
{
if (this.Parent is Page)
return (Page)this.Parent;
return GetParentPage(this.Parent);
}
これを行う方法は、インターフェイスを作成し、そのインターフェイスを実装し、this.Pageを使用してコントロールからページを取得し、インターフェイスにキャストしてからメソッドを呼び出すことであることがわかりました。
次のようにNamingContainerを使用する必要があります。
try
{
if (!string.IsNullOrWhiteSpace(TargetCtrlID))
{
var ctrl = NamingContainer.FindControl(TargetCtrlID);
if(ctrl != null)
Console.Write("'" + ctrl.ClientID + "'");
}
}
catch
{
}
すべてのコントロールには、親にアクセスするために使用できる親プロパティがあります。
protected void Page_Load(object sender, EventArgs e)
{
Response.Write(this.Parent.ID);
}
編集:参照を保存するページのライフサイクルイベントの1つと、その参照の保存に使用するものによって異なります。ただし、参照は常に利用可能です
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");
}
}
ユーザーコントロールでデリゲートを作成し、親ページからメソッドを割り当てます。
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
}
}