我正在尝试处理来自用户控件的事件。我想测试某个条件并在页面上的事件处理程序中读取其值。我首先在 VB 中尝试使用处理程序来控制正常的 Declare 和 Raiseevent:
AddHandler foo.TestEvent, AddressOf fooHandler
Private Sub fooHandler(byval Condition as string)
End Sub
这根本不起作用。我看了几个例子,但我不明白它们,因为大量的代码看起来像是多余的。有人能给我指一个简单的、最好是 VB 的、实际有效的示例吗?
非常感谢。
好的,如前所述,我们想要简单。
那么,让我们来制作一个控件。这将是一个简单的文本框,在该文本框旁边,我们有一个按钮。
所以,让我们创建一个新的用户控件,到目前为止我们已经有了这个标记:
<asp:TextBox ID="tBox" runat="server"></asp:TextBox>
<asp:Button ID="btn" runat="server" Text=""
style="margin-left:20px"
/>
现在,对于隐藏代码,我们有一个“文本”属性(用于文本框),并有一个按钮属性。
所以,我们就说后面的代码:
Public Class BoxButton
Inherits System.Web.UI.UserControl
Public Property Text As String
Get
Return tBox.Text
End Get
Set(value As String)
tBox.Text = value
End Set
End Property
Public Property ButtonText As String
Get
If btn.Text = "" Then
btn.Text = "Button"
End If
Return btn.Text
End Get
Set(value As String)
btn.Text = value
End Set
End Property
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
End Sub
因此,请注意,对于控件的任何公共属性,当我们将该用户控件拖放到页面中时,它会在控件属性表中显示得相当漂亮。如果您在标记中编辑控件,它还将提供英特尔感知。
因此,我们创建一个测试页面,从项目资源管理器中拖放控件。
因此,请注意上面的内容,我们如何填写属性表,因为任何公共属性都会显示在该控件的属性表中。
所以,现在当我们在测试页面中运行上面时,我们得到:
请注意,即使在代码隐藏中,我们也可以使用这些公共属性来设置或获取文本框值(Text)或按钮文本(ButtonText)。
当然,我们现在想要向用户控件添加一个单击事件,当然,就像我们放入页面中的任何控件一样,该事件必须在当前页面中运行,并且与此类控件的任何其他事件一样工作。
因此,我们现在将添加一个单击事件,并正确连接它。
那么,回到我们的用户控件。首先,我们向用户控件添加一个按钮单击事件(您可以通过双击按钮来完成此操作,或者在 onclick= 中的标记类型中执行此操作(intel-sense 将弹出一个对话框来创建新事件)。无论哪种方式都是很好,但将来请记住这个技巧,因为如果将任何按钮(或用户控件)按钮放入网格视图中,则无法双击嵌套在该网格内的此类按钮来创建单击事件,但你可以通过标记。当我学会这个技巧时,这是一个令人震惊的启示,现在我经常添加按钮单击事件来表示 GridView 中的按钮。
好的,那么我们添加点击事件。当我们点击那个按钮时?
嗯,它将“如何必须返回到包含该按钮的页面。
因此,我们添加一个公共事件属性,从而将其添加到我们的用户控件中:
Public Event MyClick As EventHandler
Protected Sub btn_Click(sender As Object, e As EventArgs)
RaiseEvent MyClick(sender, e)
End Sub
因此,请记住,现在标记中的事件需要以事件“On”为前缀。这个自动的。
现在,让代码回到测试页面,并添加一个点击事件。我将使用建议的标记来执行此操作:
所以,它看起来像这样:
所以,现在如果我进入测试页面,我会发现已经创建了一个事件存根。
看起来像这样,并且工作正常:
Protected Sub BoxButton_MyClick()
Debug.Print($"Text box value ={BoxButton.Text} ")
Debug.Print($"Button text value ={BoxButton.ButtonText} ")
' so, any old code goes here for this custom control button click
' ' event
End Sub
现在,敏锐的人会注意到上面的按钮单击事件实际上并不是 100% 正确,因为它应该有发送者和事件。代码存根可以工作,但您可以手动编辑代码存根并添加 2 个缺少的参数。
比如这样:
Protected Sub BoxButton_MyClick(sender As Object, e As EventArgs)
因此,上面是一个“简单的”示例,应该足以满足您的大部分需求。
所以,我花了很多时间才弄清楚“为什么”生成的代码存根在子定义中不包含上述两个参数。但是,如果您不需要使用发送者和 e(事件参数),则可以省略它们。
下一步是让闪电和事件选项卡显示在属性表中。我从来没有弄清楚如何使该功能发挥作用,但在过去,建议是您必须将用户控件转换为服务器控件(它们很常见,但服务器控件是更多移动部件)。然而,服务器控件虽然像用户控件一样工作,但可以添加到工具箱中,并部署为 .dll,并且需要更多的移动部件。
如上所示,用户控件非常容易创建,并且是创建可重用组件的好方法。