ユーザー コントロールをページに登録しました ユーザー コントロールaspx
のボタンのクリック イベントで、親ページのコード ビハインドにあるメソッドを呼び出すにはどうすればよいですか?
ありがとう。
ユーザー コントロールをページに登録しました ユーザー コントロールaspx
のボタンのクリック イベントで、親ページのコード ビハインドにあるメソッドを呼び出すにはどうすればよいですか?
ありがとう。
これは、Freddy Rios (Web アプリケーション プロジェクトの C#) によって提案されたイベントを使用した古典的な例です。これは、独自のデリゲートを作成するのではなく、既存のデリゲートを使用すること、およびイベント引数によって親ページに固有のものを渡さないことを前提としています。
ユーザー コントロールのコード ビハインド (コード ビハインドまたは C# を使用しない場合は、必要に応じて調整します):
public partial class MyUserControl : System.Web.UI.UserControl
{
public event EventHandler UserControlButtonClicked;
private void OnUserControlButtonClick()
{
if (UserControlButtonClicked != null)
{
UserControlButtonClicked(this, EventArgs.Empty);
}
}
protected void TheButton_Click(object sender, EventArgs e)
{
// .... do stuff then fire off the event
OnUserControlButtonClick();
}
// .... other code for the user control beyond this point
}
ページ自体で、次のような方法でイベントをサブスクライブします。
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
// hook up event handler for exposed user control event
MyUserControl.UserControlButtonClicked += new
EventHandler(MyUserControl_UserControlButtonClicked);
}
private void MyUserControl_UserControlButtonClicked(object sender, EventArgs e)
{
// ... do something when event is fired
}
}
プロジェクト内の特定のページとしてページをキャストします。
((MyPageName)this.Page).CustomMethod()
コントロールを特定のページに結び付けるため、pageメソッドを直接呼び出さないことをお勧めします。
代わりに、イベントを公開し、ページにサブスクライブさせます。これは任意の数のページで機能し、コントロールが1つのページ(おそらくリスト上でも)に複数回ある場合に、より簡単に使用でき、asp.controlの設計とより一致しています。
適切で適切なアプローチに従い、
イベントとデリゲートの概念を使用して、親ページのメソッドと同じ署名としてデリゲートを作成し、親ページの読み込みイベントで親メソッドをそれに割り当ててから、ユーザー コントロールのイベントを介してこのデリゲートを呼び出します。
コードサンプルとリンクを以下に示します。
//Parent Page aspx.cs part
public partial class getproductdetails : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
ucPrompt.checkIfExist += new uc_prompt.customHandler(MyParentMethod);
}
bool MyParentMethod(object sender)
{
//Do Work
}
}
//User control parts
public partial class uc_prompt : System.Web.UI.UserControl
{
protected void Page_Load(object sender, EventArgs e)
{
}
public delegate bool customHandler(object sender);
public event customHandler checkIfExist;
protected void btnYes_Click(object sender, EventArgs e)
{
checkIfExist(sender);
}
}
それがどのように機能するかの詳細を読む(参考): -
Scott Allenには、ユーザーコントロールから親ページへのイベントバブリングに関する有用な記事があります。これは、StephenM.Reddによって提供された回答について詳しく説明しています。
このシナリオを実行したい:
LoadEditCategory
メソッド (親メソッド)。LoadEditCategory
) が必要です。int
CategoryID
RightControlPanel
、同じ親ページ フォルダーにあります。子ユーザー コントロール
1- Action
( _LoadEditCategory
)を追加
public Action<int> _LoadEditCategory = null;
<int>
はint
引数 ( CategoryID
) です。
2-これAction
をボタンイベント(btnSave
ボタン名)で次のように使用します。
void btnSave_Click(object sender, EventArgs e)
{
//123 is test integer for CategoryID
_LoadEditCategory(123);
}
親ページまたは親ユーザー コントロール
3-親メソッドを追加
private void LoadEditCategory(int CategoryID)
{
// CategoryID is 123 in my example
//Do some things with CategoryID
}
4- 子ユーザー コントロールをロードするときにこのコードを追加します ( RightControlPanel
)
//Load child user control
RightControlPanel si = this.LoadControl(this.ControlPath + "RightControlPanel.ascx") as RightControlPanel;
if (si != null)
{
...
//For call parent method in child user control
si._LoadEditCategory = c => LoadEditCategory(c);
...
}
//c#
//In parent page
public void test(string S)
{
Label1.Text = S;
}
//In user control
protected void Button1_Click(object sender, System.EventArgs e)
{
//Calling "test method" of parent page from user control
((object)this.Page).test("Hello!!");
}
'VB.Net
'In parent page
Sub test(ByVal S As String)
Label1.Text = S
End Sub
'In user control
Protected Sub Button1_Click(sender As Object, e As System.EventArgs) Handles Button1.Click
'Calling "test method" of parent page from user control
DirectCast(Me.Page, Object).test("Hello!!")
End Sub
セッションを使用できます。ユーザーコントロールのボタンをクリックしたとき、および親ページメソッドを呼び出したいときは、ボタンのイベントハンドラーで次のように設定値をクリックします。
Session["CallParent"]="someValue";
ボタンはページをポストバックします。親ページのPage_Loadイベントに追加します
protected void Page_Load(object sender,EventArgs e)
{
if(Session["CallParent"]!=null)
{
// here call the Parent Page method
Method1();
// now make the session value null
Session["CallParent"]=null;
}
}
それははるかに効率的です