Вы можете использовать концепцию BubbleEvent для этого. BubbleEvent поднимается вверх по иерархии управления, пока кто-то не обработает его. Элементы управления GridView и Repeater делают это со своими событиями Row / ItemCommand.
Вы можете реализовать его в WebUserControl1, превратив его в стандартное событие для страницы (как это делает GridView):
Class UserControl1 ' Parent
Protected Override Function OnBubbleEvent(sender as Object, e as EventArgs) as Boolean
Dim c as CommandEventArgs = TryCast(e, CommandEventArgs)
If c IsNot Nothing Then
RaiseEvent ItemEvent(sender, c)
Return True ' Cancel the bubbling, so it doesn't go up any further in the hierarchy
End If
Return False ' Couldn't handle, so let it bubble
End Function
Public Event ItemEvent as EventHandler(Of CommandEventArgs)
End Class
Class UserControlB ' Child
Protected Sub OnClicked(e as EventArgs)
' Raise a direct event for any handlers attached directly
RaiseEvent Clicked(Me, e)
' And raise a bubble event for parent control
RaiseBubbleEvent(Me, New CommandEventArgs("Clicked", Nothing))
End Sub
Protected Sub OnMoved(e as EventArgs)
' Raise a direct event for any handlers attached directly
RaiseEvent Moved(Me, e)
' And raise a bubble event for parent control
RaiseBubbleEvent(Me, New CommandEventArgs("Moved", Nothing))
End Sub
End Class
Class PageA
Sub UserControl1_ItemEvent(sender as Object, e as CommandEventArgs) Handles UserControl1.ItemEvent
Response.Write(sender.GetType().Name & " was " & e.CommandName)
End Sub
End Class
Или сделайте это прямо на странице. UserControlB (Child) - то же самое, что и выше, и UserControl1 (Parent) не должен делать ничего особенного - OnBubbleEvent по умолчанию возвращает False, поэтому событие всплывает:
Class PageA
Protected Override Function OnBubbleEvent(sender as Object, e as EventArgs) as Boolean
If sender Is UserControlB Then
Dim c as CommandEventArgs = TryCast(e, CommandEventArgs)
If c IsNot Nothing Then
Response.Write(sender.GetType().Name & " was " & c.CommandName)
Else
Response.Write(sender.GetType().Name & " raised an event, with " & e.GetType().Name & " args)
End If
Return True ' Cancel the bubbling, so it doesn't go up any further in the hierarchy
End If
Return False ' Not handled
End Function
End Class
Если ваше первоначальное событие происходит от серверного элемента управления (например, Button.Click), то оно будет закодировано, чтобы уже вызывать событие пузыря - поэтому UserControlB (Child) не нужно ничего делать, чтобы передать это родитель тоже. Вам просто нужно вызвать RaiseBubbleEvent для любого из ваших пользовательских событий или если вы хотите каким-то образом преобразовать EventArgs.