Вызов метода на родительской странице из пользовательского элемента управления - PullRequest
39 голосов
/ 08 марта 2009

У меня есть пользовательский элемент управления, зарегистрированный на странице aspx При событии нажатия кнопки в пользовательском элементе управления, как я могу вызвать метод, который есть в коде родительской страницы?

Спасибо.

Ответы [ 10 ]

111 голосов
/ 08 марта 2009

Вот классический пример использования событий, предложенный Фредди Риосом (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
    }

}
14 голосов
/ 08 марта 2009

Приведите страницу как конкретную страницу в вашем проекте:

((MyPageName)this.Page).CustomMethod()
10 голосов
/ 08 марта 2009

Я предлагаю вам не вызывать метод страницы напрямую, так как вы привязываете свой элемент управления к конкретной странице.

Вместо этого выставьте событие и попросите страницу подписаться на него. Он работает для любого количества страниц, его легче использовать, когда элемент управления несколько раз на одной странице (возможно, даже в списке) и более соответствует дизайну asp.control.

4 голосов
/ 29 мая 2013

Следуйте хорошему и правильному подходу,

Используйте концепцию события и делегата, сделайте делегат такой же сигнатурой, что и ваш метод на родительской странице, а затем присвойте ему родительский метад в событии загрузки родительской страницы, затем вызовите этот делегат через событие в пользовательском элементе управления.

пример кода и ссылка приведены ниже.

//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 голосов
/ 13 августа 2009

Скотт Аллен имеет полезную статью о передаче событий от пользовательского элемента управления на родительскую страницу, в которой подробно рассматривается ответ, предоставленный Стивеном М. Реддом :

2 голосов
/ 14 декабря 2016

Я хочу сделать этот сценарий:

  • Вызов 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);

   ...
 }
0 голосов
/ 08 марта 2019

Я разместил кое-что, что работает здесь: Контроль доступа> страница> мастер вложенный> мастер

Или, если вы хотите получить доступ к элементу управления, вы также можете сделать это:

Обновить родительскую страницу Где родитель имеет панель обновления с именем «UpdatePanel1»

Контроль

UpdatePanel onParent1 = (UpdatePanel)Parent.FindControl("UpdatePanel1");
onParent1.Update();
0 голосов
/ 15 февраля 2018

Мне нравится ответ Стивена М. Редда, и мне пришлось преобразовать его в 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 голосов
/ 10 ноября 2014
 //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 голосов
/ 18 февраля 2011

Вы можете использовать сессию. Скажем, когда вы нажимаете кнопку в пользовательском элементе управления и когда вы хотите вызвать метод родительской страницы, тогда в обработчике события нажатия кнопки установите значение как

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

Это намного эффективнее

...