从主控页面上的用户控制ASPX上的用户控制调用功能

时间:2011-01-31 16:36:00

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

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

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

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

我见过几个类似的例子,但没有一个符合这种布局。

3 个答案:

答案 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文章。