我有MainLayout.master,上面有UC_Menu.ascx。
我有一个名为Customer.aspx的页面,它使用MainLayout.master。 Customer.aspx还包含名为UC_Details.ascx的UserControl。
在这种情况下,如何让UC_Menu.ascx调用UC_Details.ascx中的函数?
我见过几个类似的例子,但没有一个符合这种布局。
答案 0 :(得分:3)
在我看来,你应该从UC_Menu.ascx提出事件,然后在Master页面中处理它并再次从Master页面再次发起事件。最后,您可以使用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标记:
<%@ MasterType VirtualPath="~/MasterPages/MainLayout.master" %>
4)在UC_Details.ascx.vb中定义一些应该调用的方法:
Public Sub DoWork()
'Do some work here
End Sub
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
答案 1 :(得分:1)
有趣的场景。让页面实现一个接口:
public interface IDetailsPage
{
UC_Details DetailsControl { get; }
}
然后该页面将直接公开该属性的控件。在UC_Menu中,使用:
if (this.Page is IDetailsPage)
((IDetailsPage)this.Page).DetailsControl.CallMethod();
HTH。
答案 2 :(得分:-1)
您应该在母版页上找到UC_Menu,并调用它的方法:
var c = (UC_Menu) Master.FindControl("UC_Menu");
if (c != null)
{
c.CallMethod();
}
结帐this文章。