C# 从母版页上的UserControl从ASPX上的UserControl调用函数

C# 从母版页上的UserControl从ASPX上的UserControl调用函数,c#,asp.net,vb.net,user-controls,C#,Asp.net,Vb.net,User Controls,我有MainLayout.master,上面有UC_Menu.ascx 我有一个名为Customer.aspx的页面,它使用MainLayout.master。Customer.aspx还包含一个名为UC_Details.ascx的用户控件 在这种情况下,如何让UC_Menu.ascx调用UC_Details.ascx中的函数 我见过一些类似的例子,但没有一个与这种布局匹配。您应该在母版页上找到UC_菜单,并调用它的方法: var c = (UC_Menu) Master.FindControl

我有MainLayout.master,上面有UC_Menu.ascx

我有一个名为Customer.aspx的页面,它使用MainLayout.master。Customer.aspx还包含一个名为UC_Details.ascx的用户控件

在这种情况下,如何让UC_Menu.ascx调用UC_Details.ascx中的函数


我见过一些类似的例子,但没有一个与这种布局匹配。

您应该在母版页上找到UC_菜单,并调用它的方法:

var c = (UC_Menu) Master.FindControl("UC_Menu");
if (c != null)
{
    c.CallMethod();
}

结帐文章。

您应该在母版页上找到UC_菜单,并调用其方法:

var c = (UC_Menu) Master.FindControl("UC_Menu");
if (c != null)
{
    c.CallMethod();
}

签出文章。

在我看来,您应该从UC_Menu.ascx引发事件,然后在母版页中处理它,并从母版页再次引发事件。最后,您可以使用Customer.aspx中的事件处理程序截取事件,并从UC_Details.ascx调用函数

因此,该问题的代码应为:

1) 在UC_Menu.ascx.vb中引发事件:

Partial Class UserControls_UC_Menu
    Inherits System.Web.UI.UserControl

    Public Event SomethingChanged As EventHandler

    Public Sub SomethingHappend()
        RaiseEvent SomethingChanged(Me, EventArgs.Empty)
    End Sub

End Class
2) 在母版页中捕获事件并将其提升到Customer.aspx

Public Event SomethingChanged As EventHandler

Private Sub UC_MenuInstance_SomethingChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles UC_Menu.SomethingChanged
     RaiseEvent Me.SomethingChanged(Me, EventArgs.Empty)
End Sub
3) 在Customer.aspx markup after page指令中定义:

<%@ MasterType VirtualPath="~/MasterPages/MainLayout.master" %>
5) 放入Customer.aspx.vb:

' Add handler for Master page event
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs)
    AddHandler Me.Master.SomethingChanged, AddressOf MasterEventHandler
End Sub

' Call UC_Details user control function here
Private Sub MasterEventHandler(ByVal source As Object, ByVal e As EventArgs)
        UC_DetailsInstance.DoWork()
    End Sub

在我看来,您应该从UC_Menu.ascx引发事件,然后在母版页中处理它,并从母版页再次引发事件。最后,您可以使用Customer.aspx中的事件处理程序截取事件,并从UC_Details.ascx调用函数

因此,该问题的代码应为:

1) 在UC_Menu.ascx.vb中引发事件:

Partial Class UserControls_UC_Menu
    Inherits System.Web.UI.UserControl

    Public Event SomethingChanged As EventHandler

    Public Sub SomethingHappend()
        RaiseEvent SomethingChanged(Me, EventArgs.Empty)
    End Sub

End Class
2) 在母版页中捕获事件并将其提升到Customer.aspx

Public Event SomethingChanged As EventHandler

Private Sub UC_MenuInstance_SomethingChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles UC_Menu.SomethingChanged
     RaiseEvent Me.SomethingChanged(Me, EventArgs.Empty)
End Sub
3) 在Customer.aspx markup after page指令中定义:

<%@ MasterType VirtualPath="~/MasterPages/MainLayout.master" %>
5) 放入Customer.aspx.vb:

' Add handler for Master page event
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs)
    AddHandler Me.Master.SomethingChanged, AddressOf MasterEventHandler
End Sub

' Call UC_Details user control function here
Private Sub MasterEventHandler(ByVal source As Object, ByVal e As EventArgs)
        UC_DetailsInstance.DoWork()
    End Sub

有趣的情景。让页面实现一个接口:

public interface IDetailsPage
{
   UC_Details DetailsControl { get; }
}
然后,该页将直接公开该属性的控件。在UC_菜单中,使用:

if (this.Page is IDetailsPage)
    ((IDetailsPage)this.Page).DetailsControl.CallMethod();

HTH.

有趣的场景。让页面实现一个接口:

public interface IDetailsPage
{
   UC_Details DetailsControl { get; }
}
然后,该页将直接公开该属性的控件。在UC_菜单中,使用:

if (this.Page is IDetailsPage)
    ((IDetailsPage)this.Page).DetailsControl.CallMethod();


HTH.

UC_详细信息在用户控件中,而不是在主控件中。你明白了backwards@Victor将UC_详情更改为UC_菜单。没关系。这是访问母版页控件的方式。UC_详细信息在用户控件中,而不是母版中。你明白了backwards@Victor将UC_详情更改为UC_菜单。没关系。这是访问母版页控件的方式。我让UC_详细信息页实现了一个界面,但当我尝试在UC_菜单中公开控件属性时,我收到一个错误,说没有定义IDetailsPage。我刚刚意识到我没有在UC_菜单的源代码中引用UC_详细信息。我现在可以在UC_Menu.ascx的代码隐藏中公开我的函数,但它从未执行过,因为“if(this.Page is IDetailsPage)”从来都不是真的。有什么建议吗?我让UC_详细信息页面实现了一个界面,但是当我试图在UC_菜单中公开控件属性时,我收到一个错误,说没有定义IDetailsPage。我刚刚意识到我没有在UC_菜单的源代码中引用UC_详细信息。我现在可以在UC_Menu.ascx的代码隐藏中公开我的函数,但它从未执行过,因为“if(this.Page is IDetailsPage)”从来都不是真的。有什么建议吗?据我所知,UC_Menu.ascx属于母版页。从子控件抛出事件到父控件抛出事件之间进行通信是一种很好的做法。所以,您应该在UC_Menu.ascx中引发事件,并在母版页代码中处理它。然后,我们应该在主控页不知道任何关于它的内容页。所以,从母版页到内容页进行通信的唯一可能的方法是再次从母版页引发事件。然后,您应该在Customer.aspx事件处理程序中设置此事件,在事件处理程序内部,您应该调用UC_Details.ascx上的必需函数,它是Customer.aspx页面的子级。我对使用RaiseEvent还不熟悉,所以我一直在尝试了解它。你能解释一下如何在Master中设置代码来做一些简单的事情,比如更改母版页上标签的文本吗?你更喜欢哪种语言vb.net还是c#?我在使用Customer.aspx.vb时遇到了setp#5的问题。我已经完成了所提供代码的几乎所有内容,但是,在尝试键入UC_DetailsInstance.DoWork()时,我无法让IntelliSense显示DoWork。据我所知,UC_Menu.ascx属于母版页。从子控件抛出事件到父控件抛出事件之间进行通信是一种很好的做法。所以,您应该在UC_Menu.ascx中引发事件,并在母版页代码中处理它。然后,我们应该在主控页不知道任何关于它的内容页。所以,从母版页到内容页进行通信的唯一可能的方法是再次从母版页引发事件。然后,您应该在Customer.aspx事件处理程序中设置此事件,在事件处理程序内部,您应该调用UC_Details.ascx上的必需函数,它是Customer.aspx页面的子级。我对使用RaiseEvent还不熟悉,所以我一直在尝试了解它。你能解释一下如何在Master中设置代码来做一些简单的事情,比如更改母版页上标签的文本吗?你更喜欢哪种语言vb.net还是c#?我在使用Customer.aspx.vb时遇到了setp#5的问题。我已经完成了所提供代码的几乎所有内容,但是,在尝试键入UC_DetailsInstance.DoWork()时,我无法让IntelliSense显示DoWork。