Невозможно захватить событие нажатия кнопки на пользовательском контроле
Прошло 4 часа с тех пор, как я подумал: "Как я могу запустить свое событие нажатием кнопки управления пользователя?" и ответ пришел очень быстро: "Я могу остановить событие нажатия кнопки и поднять мой оттуда!" и после 4 часов отладки и отладки, а также большего количества отладки и жизненного цикла страницы, большего количества отладки и дополнительных точек останова, и так далее, и так далее, и я обращаюсь за помощью к БОЛЬШОМУ СТАКОВЕРФЛОУ (кланяется). Так что вопрос довольно прост; Почему я не могу зафиксировать событие on click кнопки, помещенной в пользовательский элемент управления, чтобы я мог вызвать свое событие? Что касается кода: вот 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, поэтому обновленная версия codebehind выглядит следующим образом:
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 в свой usercontrol, но безуспешно, и после этого я опубликовал вопрос.
2 ответа
Если я правильно понимаю (с моим не очень хорошим знанием VB.net), вы динамически добавляете кнопку в свой пользовательский элемент управления. Но событие нажатия кнопки никогда не связывается. Если вы просто добавите обработчик для события нажатия кнопки в вашем пользовательском элементе управления, вероятно, все будет работать для вас.
Еще один совет, когда играешь с динамическими элементами управления, всегда старайся page init
или же preinit
так что вы можете использовать преимущества viewstate
,
Изменить 1:
Я создал образец для вас, который поможет вам решить проблему. Для вашего пользовательского контроля вы можете поместить кнопку в самом дизайнере (вот что я сделал): [User Control Designer]
<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" />
Надеюсь это поможет.
Шашанк прав. Здесь кто-то написал что-то подобное
Динамическое событие командной кнопки ASP.NET не запускается
Видимо, в вашем коде отсутствует инструкция
AddHandler _button.Click, AddressOf btn_Click
добавить обработчик для нажатия кнопки и удалить
Protected Sub _button_Clicked(sender As Object, e As EventArgs)
RaiseEvent ClickBtn(Nothing, Nothing)
End Sub