无法在usercontrol上捕获按钮onclick事件

时间:2014-02-23 18:23:39

标签: asp.net vb.net events user-controls raiseevent

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

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

usercontrol的代码隐藏:

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:

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

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

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

2 个答案:

答案 0 :(得分:1)

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

使用动态控件时的另一条建议总是尝试在page initpreinit上添加控件,以便您可以利用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。页面上的以下两行添加了用户控件并为我处理了事件: [网页设计器(添加用户控件)]

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

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

希望这有帮助。

答案 1 :(得分:1)

Shashank是对的。这里有人写了类似的东西

ASP.NET dynamic Command Button event not firing

显然,您的代码缺少指令

AddHandler _button.Click, AddressOf btn_Click

添加按钮单击的处理程序,然后删除

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