【问题标题】:Cannot capture button onclick event on usercontrol无法捕获用户控件上的按钮 onclick 事件
【发布时间】:2014-02-23 18:23:38
【问题描述】:

自从我想到“如何通过用户控件的按钮单击触发我的事件?”已经 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 标记但没有成功,之后我发布了问题。

【问题讨论】:

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


【解决方案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"  />

希望这会有所帮助。

【讨论】:

  • 我添加了处理程序,但仍然没有,点击时它永远不会到达断点。查看我的编辑:(
  • 您是否尝试将按钮定义从预渲染移动到页面初始化。
  • 移动按钮定义是什么意思?你可以给我一个例子吗?如果您的意思是在另一个事件上调用 Page.Controls.Add 方法,那么答案是肯定的……我已经尝试过 init 预渲染,否则如果您可以更具体一点,那将非常有用。非常感谢!
  • 我已经更新了我的答案。我也测试了代码并且工作正常。
  • 谢谢,我创建了另一个项目,尝试了这个,它就像一个魅力,但是在我的项目中它仍然不起作用:(,但现在我知道问题出在其他地方。谢谢您对我的耐心和耐心。祝您在所做的每一件事上都取得成功!
【解决方案2】:

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

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

【讨论】:

  • 在写这篇文章之前,我已经添加了处理程序,然后我将按钮添加到我的 ascx 页面(带有标签)并在那里处理绑定但没有任何效果。对不起,如果这令人困惑。非常感谢!
猜你喜欢
  • 2013-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-08
  • 1970-01-01
相关资源
最近更新 更多