Невозможно захватить событие нажатия кнопки на пользовательском контроле

Прошло 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
Другие вопросы по тегам