2011-01-31 4 views
0

У меня есть MainLayout.master, на котором есть UC_Menu.ascx.Функция вызова из UserControl на ASPX из UserControl на MasterPage

У меня есть страница Customer.aspx, которая использует MainLayout.master. Customer.aspx также содержит UserControl с именем UC_Details.ascx.

Как я могу вызвать UC_Menu.ascx функцию, которая находится в UC_Details.ascx с этим сценарием?

Я видел несколько подобных примеров, но ни один из них не соответствует этому типу макета.

ответ

3

На мой взгляд, вы должны поднять событие из 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) В случае Master страница улове и поднять его Заказчику .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 
+0

Не могли бы вы уточнить? – crjunk

+0

Как я понимаю, UC_Menu.ascx принадлежит к главной странице. Эффективная практика заключается в том, чтобы общаться с дочерним элементом управления родительским событием. Итак, вы должны поднять событие в UC_Menu.ascx и обработать его в коде главной страницы. Затем мы должны понимать, что страница мастера ничего не знает об этой странице контента. Таким образом, единственный возможный способ связи с главной страницы на страницу контента - снова поднимать событие с главной страницы. Затем вы должны установить в обработчике событий Customer.aspx для этого события и внутри обработчика событий вы должны вызвать требуемую функцию на UC_Details.ascx, которая является дочерней на странице Customer.aspx. – apros

+0

Я новичок в использовании RaiseEvent, поэтому я пытался его прочитать.Можете ли вы объяснить, как настроить код в Master, чтобы сделать что-то простое, например, изменить текст метки на главной странице? – crjunk

-1

Вы должны найти UC_Menu на главной странице, и называют это метод:

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

заказ this статьи.

+0

UC_Details находится в пользовательском режиме, а не в главном. вы получили его обратно – Victor

+0

@ Изменение VCCORD_Details для UC_Menu. Не имеет значения. Это способ управления доступом к MasterPage. – gor

1

Интересный сценарий. Внесите на страницу интерфейс с интерфейсом:

public interface IDetailsPage 
{ 
    UC_Details DetailsControl { get; } 
} 

Затем страница будет непосредственно раскрывать контроль над объектом. В UC_Menu используйте:

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

HTH.

+0

У меня была страница UC_Detail, реализующая интерфейс, но когда я пытаюсь открыть свойство управления в UC_Menu, я получаю сообщение об ошибке, указывающее, что IDetailsPage не определен. – crjunk

+0

Только что понял, что я не ссылаюсь на UC_Details в исходном коде для UC_Menu. – crjunk

+0

Теперь я могу выставить свою функцию в коде для UC_Menu.ascx, но она никогда не выполняется, потому что «if (this.Page is IDetailsPage)» никогда не будет правдой. Какие-либо предложения? – crjunk

Смежные вопросы