自从我想到“如何从用户控件的按钮点击触发我的事件?”以来已经过了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标签,但没有成功,之后我发布了这个问题。
答案 0 :(得分: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。页面上的以下两行添加了用户控件并为我处理了事件: [网页设计器(添加用户控件)]
<%@ Register src="WebUserControl1.ascx" tagname="WebUserControl1" tagprefix="uc1" %>
<uc1:WebUserControl1 ID="WebUserControl11" runat="server" OnAnEvent="WebUserControl11_AnEvent" />
希望这有帮助。
答案 1 :(得分:1)
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