在页面代码后面的用户控件中引发事件的问题

问题描述 投票:0回答:1

我正在尝试处理来自用户控件的事件。我想测试某个条件并在页面上的事件处理程序中读取其值。我首先在 VB 中尝试使用处理程序来控制正常的 Declare 和 Raiseevent:

    AddHandler foo.TestEvent, AddressOf fooHandler

    Private Sub fooHandler(byval Condition as string)

    End Sub

这根本不起作用。我看了几个例子,但我不明白它们,因为大量的代码看起来像是多余的。有人能给我指一个简单的、最好是 VB 的、实际有效的示例吗?

非常感谢。

asp.net vb.net web
1个回答
0
投票

好的,如前所述,我们想要简单。

那么,让我们来制作一个控件。这将是一个简单的文本框,在该文本框旁边,我们有一个按钮。

所以,让我们创建一个新的用户控件,到目前为止我们已经有了这个标记:

<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,并且需要更多的移动部件。

如上所示,用户控件非常容易创建,并且是创建可重用组件的好方法。

© www.soinside.com 2019 - 2024. All rights reserved.