web-dev-qa-db-ja.com

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

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

ありがとう。

39
Jeremy Thomson

以下は、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
    }

}
114
Stephen M. Redd

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

((MyPageName)this.Page).CustomMethod()
14
Rex M

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

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

10
eglasius

適切で適切なアプローチに従ってください。

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

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

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

仕組みの詳細を読む(リファレンス):-

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

4
Rohit

Scott Allen には、ユーザーコントロールから親ページへのイベントバブリングに関する有用な記事があり、 Stephen M. Redd

4
MagicAndi

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

  • LoadEditCategoryメソッド(親メソッド)を呼び出します。
  • 親メソッド(LoadEditCategory)にはint引数(CategoryID)が必要です。
  • 子ユーザーコントロールは、同じ親ページフォルダーにあるRightControlPanelです。

子ユーザーコントロール

1- Action_LoadEditCategory

public Action<int> _LoadEditCategory = null;

<int>int引数(CategoryID)です。

2-次のように、ボタンイベント(Actionbutton名)でこの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);

   ...
 }
2
Ali Soltani
 //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 
0
Güven Acar

ここで機能するものを投稿しました: アクセス制御>ページ>マスターネスト>マスター

または、コントロールにアクセスしたい場合は、これを行うこともできます:

親ページの更新親には「UpdatePanel1」という名前の更新パネルがあります

コントロール

UpdatePanel onParent1 = (UpdatePanel)Parent.FindControl("UpdatePanel1");
onParent1.Update();
0
Stewart

スティーブンM.レッドの回答が大好きで、VBに変換する必要がありました。ここで共有します。提案された編集を歓迎します。

ユーザーコントロールの分離コード:

Public Class MyUserControl
    Inherits System.Web.UI.UserControl

    'expose the event publicly
    Public Event UserControlButtonClicked As EventHandler 

    'a method to raise the publicly exposed event
    Private Sub OnUserControlButtonClick()

        RaiseEvent UserControlButtonClicked(Me, EventArgs.Empty)

    End Sub

    Protected Sub lbtnApplyChanges_Click(sender As Object, e As EventArgs) Handles lbtnApplyChanges.Click

        'add code to run here, then extend this code by firing off this event
        'so it will trigger the public event handler from the parent page, 
        'and the parent page can hanlde it

        OnUserControlButtonClick()

    End Sub

End Class

親ページでイベントをサブスクライブするため、イベントが発生すると、コードがここで実行されます。

Public Class SalesRecord
    Inherits System.Web.UI.Page

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

        'hook up event handler for exposed user control event to handle this
        AddHandler MyUserControl.UserControlButtonClicked, AddressOf MyUserControl_UserControlButtonClicked

    End Sub

    ''' <summary>
    ''' code to run when user clicks 'lbtnApplyChanges' on the user control
    ''' </summary>

    Private Sub MyUserControl_UserControlButtonClicked()

        'this code will now fire when lbtnApplyChanges_Click executes

    End Sub

End Class
0
Taylor Brown