42

ユーザー コントロールをページに登録しました ユーザー コントロールaspxのボタンのクリック イベントで、親ページのコード ビハインドにあるメソッドを呼び出すにはどうすればよいですか?

ありがとう。

4

10 に答える 10

125

これは、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
    }

}
于 2009-03-08T10:07:06.547 に答える
15

プロジェクト内の特定のページとしてページをキャストします。

((MyPageName)this.Page).CustomMethod()
于 2009-03-08T05:54:10.370 に答える
10

コントロールを特定のページに結び付けるため、pageメソッドを直接呼び出さないことをお勧めします。

代わりに、イベントを公開し、ページにサブスクライブさせます。これは任意の数のページで機能し、コントロールが1つのページ(おそらくリスト上でも)に複数回ある場合に、より簡単に使用でき、asp.controlの設計とより一致しています。

于 2009-03-08T06:34:05.920 に答える
6

適切で適切なアプローチに従い、

イベントとデリゲートの概念を使用して、親ページのメソッドと同じ署名としてデリゲートを作成し、親ページの読み込みイベントで親メソッドをそれに割り当ててから、ユーザー コントロールのイベントを介してこのデリゲートを呼び出します。

コードサンプルとリンクを以下に示します。

//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);
 }
}

それがどのように機能するかの詳細を読む(参考): -

ユーザーコントロールから親ページのメソッドを呼び出す

于 2013-05-29T11:36:45.810 に答える
4

Scott Allenには、ユーザーコントロールから親ページへのイベントバブリングに関する有用な記事があります。これは、StephenM.Reddによって提供された回答について詳しく説明しています。

于 2009-08-13T09:36:24.050 に答える
2

このシナリオを実行したい:

  • 呼び出しLoadEditCategoryメソッド (親メソッド)。
  • 親メソッド ( ) には引数 ( LoadEditCategory) が必要です。intCategoryID
  • 子ユーザー コントロールは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);

   ...
 }
于 2016-12-14T08:50:03.463 に答える
0
 //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 
于 2014-11-10T14:53:28.160 に答える
-7

セッションを使用できます。ユーザーコントロールのボタンをクリックしたとき、および親ページメソッドを呼び出したいときは、ボタンのイベントハンドラーで次のように設定値をクリックします。

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;
    }
}

それははるかに効率的です

于 2011-02-18T06:34:04.863 に答える