【问题标题】:Calling a method in parent page from user control从用户控件调用父页面中的方法
【发布时间】:2009-03-08 05:52:59
【问题描述】:

我在aspx 页面中注册了一个用户控件 在用户控件中的按钮单击事件时,如何调用父页面代码隐藏中的方法?

谢谢。

【问题讨论】:

    标签: c# asp.net user-controls webusercontrol


    【解决方案1】:

    这是 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
        }
    
    }
    

    【讨论】:

    • 斯蒂芬,一个有用而简洁的答案。 +1。
    • 我希望我能给你 +2 :)
    • 如果我想用非 void MyUserControl_UserControlButtonClicked 向用户控件返回一些东西怎么办?
    • 完美的 +1 方式... :)
    • 我认为这不是 100% 正确的。我认为在 Page_Load() MyUserControl.UserControlButtonClicked +=new EventHandler(MyUserControl_UserControlButtonClicked);应替换为 ControlName.UserControlButtonClicked +=new EventHandler(MyUserControl_UserControlButtonClicked); - 应该使用特定控件的名称而不是类名。
    【解决方案2】:

    将页面转换为项目中的特定页面:

    ((MyPageName)this.Page).CustomMethod()
    

    【讨论】:

    • @Henk 当然它破坏了最佳实践,但是如果提问者不理解一些简单的事情,比如它是如何工作的,那么她/他以后将如何理解更大的事情。总是最好先使用最简单的方法,即使是错误的,也只是为了学习。
    • 我同意 Rex,这是提问者提出的问题,很高兴回答这个问题,而不是总是告诉问题是错误的。
    【解决方案3】:

    我建议您不要直接调用 page 方法,因为您会将控件绑定到特定页面。

    改为公开一个事件,并让页面订阅它。它适用于任意数量的页面,当控件在单个页面上多次(甚至可能在列表上)时更容易使用,并且更符合 asp.control 设计。

    【讨论】:

      【解决方案4】:

      遵循良好和适当的方法,

      使用事件和委托概念使委托与父页面中的方法具有相同的签名,然后在父页面加载事件中为其分配父方法,然后通过用户控件中的事件调用此委托。

      代码示例和链接如下。

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

      阅读更多详细信息(参考):-

      Calling a method of parent page from user control

      【讨论】:

        【解决方案5】:

        Scott Allen有一篇关于从用户控件到父页面的事件冒泡的有用文章,详细阐述了Stephen M. Redd提供的答案:

        【讨论】:

          【解决方案6】:

          我想做这个场景:

          • 调用LoadEditCategory方法(父方法)。
          • 父方法 (LoadEditCategory) 需要一个 int 参数 (CategoryID)。
          • 子用户控件是RightControlPanel,位于同一父页面文件夹中。

          儿童用户控制

          1- 添加Action (_LoadEditCategory)

          public Action<int> _LoadEditCategory = null;

          <int>int 参数 (CategoryID)。

          2- 在按钮事件(btnSavebutton 名称)中使用此 Action,如下所示:

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

          【讨论】:

            【解决方案7】:
             //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 
            

            【讨论】:

              【解决方案8】:

              我喜欢 Stephen M. Redd 的回答,不得不将其转换为 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
              

              【讨论】:

                【解决方案9】:

                我在这里发布了一些有用的东西:Access control > page > master nested > master

                或者如果你想访问一个控件,你也可以这样做:

                更新父页面 父级有一个名为“UpdatePanel1”的更新面板

                控制

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

                【讨论】:

                  【解决方案10】:

                  您可以使用 Session 。说当您单击用户控件中的按钮以及想要调用父页面方法时,然后在按钮单击的事件处理程序中将值设置为

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

                  效率更高

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2014-11-13
                    • 1970-01-01
                    • 1970-01-01
                    • 2016-07-01
                    相关资源
                    最近更新 更多