0

自从我想到“如何通过用户控件的按钮单击触发我的事件?”以来已经 4 小时了。答案很快就来了:“我可以捕获按钮的点击事件并从那里提升我的!” 经过 4 小时的调试和调试以及更多的调试和页面生命周期、更多的调试和更多的断点等等,我求助于 GREAT STACKOVERFLOW(bows)。所以这个问题很简单;为什么我不能捕获放置在用户控件内的按钮的 onclick 事件,以便触发我的事件?至于代码:这是 ascx :

<%@ Control Language="vb" AutoEventWireup="true" CodeBehind="CosmaButton.ascx.vb" Inherits="Comanda.CosmaButton" %>

用户控件背后的代码:

Public Class CosmaButton
Inherits System.Web.UI.UserControl

Public Event ClickBtn As EventHandler

Private _title As String = "test"
Private _width As Integer
Private WithEvents _button As New Button

Protected Overrides Sub OnInit(e As EventArgs)
    MyBase.OnInit(e)
End Sub

Protected Overrides Sub OnLoad(e As EventArgs)
    MyBase.OnLoad(e)
End Sub

Protected Overrides Sub OnPreRender(e As EventArgs)
    _button.CssClass = "styled"
    _button.Text = _title
    _button.Attributes("runat") = "server"
    If _width > 0 Then
        _button.Width = _width
    End If
    Me.Controls.Add(_button)
    MyBase.OnPreRender(e)
End Sub

Protected Sub _button_Clicked(sender As Object, e As EventArgs)
    RaiseEvent ClickBtn(Nothing, Nothing)

End Sub

End Class

最后是 aspx 页面的代码隐藏:

Public Class Login1
Inherits System.Web.UI.Page

Protected Sub Page_Init(sender As Object, e As EventArgs) Handles Me.Init

End Sub

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    AddHandler btn.ClickBtn, AddressOf btn_Click
End Sub

Protected Sub btn_Click(sender As Object, e As EventArgs) Handles btn.ClickBtn

End Sub

End Class

PS做了我的功课并搜索了与此问题相关的所有帖子,发现: http: //www.codeproject.com/Articles/33874/Capture-Button-s-Click-Event-of-User-Control-in-th有点令人沮丧,因为我在这个人的帖子中跟随并重新关注并一步一步地进行,但效果相同。没有可怕的点击事件!

编辑1:

为单击事件添加了处理程序,因此更新的代码隐藏版本如下:

Public Class CosmaButton
Inherits System.Web.UI.UserControl

Public Event ClickBtn As EventHandler

Private _title As String = "test"
Private _width As Integer
Private WithEvents _button As New Button

Protected Overrides Sub OnInit(e As EventArgs)
    Me.Controls.Add(_button)

    AddHandler _button.Click, AddressOf _button_Clicked

    MyBase.OnInit(e)
End Sub

Protected Overrides Sub OnLoad(e As EventArgs)
    MyBase.OnLoad(e)
End Sub

Protected Overrides Sub OnPreRender(e As EventArgs)
    _button.CssClass = "styled"
    _button.Text = _title
    _button.Attributes("runat") = "server"
    If _width > 0 Then
        _button.Width = _width
    End If
    MyBase.OnPreRender(e)
End Sub

Protected Sub _button_Clicked(sender As Object, e As EventArgs)
    RaiseEvent ClickBtn(Nothing, Nothing)

End Sub


End Class

仍然没有。我之前多次添加了处理程序,但是在阅读并尝试了提到的帖子之后,我在我的用户控件中添加了一个 asp:button 标签,但没有成功,之后我发布了这个问题。

4

2 回答 2

1

沙申克是对的。这里有人写了类似的东西

ASP.NET 动态命令按钮事件未触发

显然,您的代码缺少说明

AddHandler _button.Click, AddressOf btn_Click

为按钮单击添加处理程序,并删除

Protected Sub _button_Clicked(sender As Object, e As EventArgs)
    RaiseEvent ClickBtn(Nothing, Nothing)
End Sub
于 2014-02-23T22:54:00.257 回答
1

如果我理解正确(由于我对 VB.net 的了解不太好),那么您正在向用户控件动态添加一个按钮。但是按钮点击事件永远不会被绑定。如果您只是在用户控件上添加按钮单击事件的处理程序,那么事情可能对您有用。

使用动态控件时的另一条建议总是尝试添加控件,page init以便preinit您可以利用viewstate.

编辑1:

我为您创建了一个示例,可以帮助您解决问题。对于您的用户控件,您可以将按钮放在设计器本身中(这是我所做的): [用户控件设计器]

<asp:Button runat="server" ID="button" />

现在在用户控件后面的代码上,我添加了以下代码: [用户控件代码后面]

Public Event AnEvent()

Protected Sub button_Click(sender As Object, e As EventArgs) Handles button.Click
        RaiseEvent AnEvent()
End Sub

botton_Click 是添加到用户控件上的按钮的单击事件。单击此按钮会引发 AnEvent。现在,这使您的用户可以控制一个拥有自己事件的完整包。

剩下要做的就是将此用户控件添加到您的页面并处理 AnEvent。页面上的以下两行添加了用户控件并为我处理了事件: [Web Page Designer(添加用户控件)]

<%@ Register src="WebUserControl1.ascx" tagname="WebUserControl1" tagprefix="uc1" %>

<uc1:WebUserControl1 ID="WebUserControl11" runat="server" OnAnEvent="WebUserControl11_AnEvent"  />

希望这可以帮助。

于 2014-02-23T19:13:13.687 回答