2014-02-23 93 views
0

自從我以爲「我怎麼能從usercontrol的按鈕點擊觸發我的事件?答案非常迅速:「我可以抓住按鈕的點擊事件並從那裏提起我!」經過4個小時的調試和調試以及更多的調試和頁面生命週期以及更多的調試和更多的斷點等等,我轉而尋求GREAT STACKOVERFLOW(弓)的幫助。所以這個問題很簡單,爲什麼我不能捕獲放置在用戶控件內的按鈕的onclick事件,所以我可以觸發我的事件? 至於代碼: 這裏是ASCX:無法捕獲usercontrol上的按鈕onclick事件

背後的用戶控件
<%@ 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 這是有點令人沮喪,因爲我遵循和refollowed,並一步一步在這傢伙的職位,但效果相同。沒有嚇人的clickevent!

編輯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標記到我的用戶控件,但沒有成功,之後,我發佈了問題。

+0

我編輯了自己的冠軍。請參閱:「[應該在其標題中包含」標籤「](http://meta.stackexchange.com/questions/19190/)」,其中的共識是「不,他們不應該」。 –

回答

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。頁面上的以下兩行添加的用戶控制和handeled事件對我來說: [網頁設計師(添加用戶控制)

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

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

希望這有助於。

+0

我添加了處理程序,但仍然沒有,它從來沒有在click上點擊斷點。請參閱我的編輯:( – lauCosma

+0

)您是否嘗試將按鈕定義從預渲染移動到頁面初始化 –

+0

移動按鈕定義的含義是什麼?你給我一個例子嗎?如果你的意思是在另一個事件上調用Page.Controls.Add方法,那麼答案是肯定的......我已經嘗試過init來預渲染,否則如果你可以更具體一些,那將是非常有用的。很多! – lauCosma

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 
+0

在寫這篇文章之前,我已經添加了處理程序,之後我將按鈕添加到我的ascx頁面(帶標籤)並處理綁定,但沒有任何效果。對不起,如果這是令人困惑。非常感謝! – lauCosma