gpt4 book ai didi

asp.net - "Re-Raising".NET 中的自定义事件(本例中为 ASP.NET)

转载 作者:行者123 更新时间:2023-12-01 11:10:36 28 4
gpt4 key购买 nike

我正在使用 VB.NET 开发 ASP.NET 页面,并且我具有以下层次结构:

A页
- 网络用户控制 1
- Web 用户控件 A
- Web 用户控件 B
- Web 用户控件 C

我需要从 Web 用户控件 B 引发一个页面 A 将收到的事件(事件流将是 Web 用户控件 B -> Web 用户控件 1 -> 页面 A)。

到目前为止,我唯一的方法是:1) 向 Web 用户控件 B 和 Web 用户控件 1 添加自定义事件声明,然后简单地两次 RaiseEvent 直到它到达页面 A(这看起来很难看,我不是特别喜欢它)。

我的另一个想法是创建一个自定义事件类,它继承自某个神奇的事件基类,并在 Web 用户控件 B 和 Web 用户控件 1 中创建它的一个实例,但这被证明是徒劳的,因为我找不到任何事件基类(也许 b/c 它们都不是,因为它看起来是关键字,而不是类名)。

任何帮助将不胜感激!谢谢,编码愉快!

最佳答案

您可以使用 BubbleEvent concept去做这个。 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)无需执行任何操作即可将其发送到 parent 要么。您只需为任何自定义事件调用 RaiseBubbleEvent,或者如果您想以某种方式转换 EventArgs。

关于asp.net - "Re-Raising".NET 中的自定义事件(本例中为 ASP.NET),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/334317/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com