2010-06-07 54 views
1

我正在創建一個Web服務器控件,它上面有一個圖像按鈕。 控件的html在代碼的RenderControls中完成,控件從WebControl,IScriptControl,INamingContainer發出。Web服務器控件中的控件事件

按鈕被編碼爲遵循RenderControls:

System.Web.UI.WebControls.ImageButton img = new System.Web.UI.WebControls.ImageButton(); 
img.ImageUrl = "Url of the image"; 
img.Click += new ImageClickEventHandler(img_Click); 
img.ID = this.ClientID + "_img"; 
img.CausesValidation = false; 
imgLock.RenderControl(output); 

在瀏覽器中的按鈕apreas但是當我點擊它,頁面postsback但該按鈕的事件處理程序不被解僱,從我可以看出,因爲每次頁面被重新發布時,控件都會經歷RenderControls,按鈕被重繪,事件處理消失。

此服務器控件位於母版頁中。

任何人都可以幫助我嗎?

感謝

回答

1

當你回發在asp.net數據,將遵循不同的階段:

1.Initialization, 2.LoadViewState 3.LoadPostData 4.ObjectLoad

在階段3(的LoadPostData)的框架將在每個提交數據的控件上實現IPostBackDataHandler接口。

頁面然後觸發LoadPostData事件並將匹配每個實現此接口的控件與正確的回發數據。

這意味着您需要在Asp.net到達階段(LoadPostData)之前創建控件。

我的建議是在Page_Init上創建控件,這樣你就不會丟失事件。 (點擊進入)。

+0

由於該按鈕位於添加到母版頁的Web服務器控件中,因此我將如何使用page_init? – MarkyMarc 2010-06-07 19:34:58

+0

其實經過多一點研究後,我改變了我的服務器控件,將其子控件創建爲OnInit事件,現在它可以工作。 非常感謝讓我走上正軌 – MarkyMarc 2010-06-09 11:59:31

+0

@MarkyMarc我有同樣的問題。你究竟做了什麼?您可以發佈+1的完整解決方案嗎?謝謝! – Rushino 2012-02-16 21:01:57

1

的WebControl必須創建和頁面加載事件發生後已附加事件處理程序來處理來自用戶的任何輸入。
您應該嘗試創建ImageButton,設置事件處理程序並將其添加到重寫方法OnLoad中的Controls集合中。

protected override void OnLoad(EventArgs e) 
{ 
    System.Web.UI.WebControls.ImageButton img = new System.Web.UI.WebControls.ImageButton(); 
    img.ImageUrl = "Url of the image"; 
    img.Click += new ImageClickEventHandler(img_Click); 
    img.ID = this.ClientID + "_img"; 
    img.CausesValidation = false; 
    this.Controls.Add(img); 
} 
+0

感謝您的建議。我試過這個,我得到了同樣的結果。 – MarkyMarc 2010-06-07 19:44:43

1

難道是你的Button的ID在回傳之間改變了嗎?

img.ID = this.ClientID 

......看起來很奇怪。將它替換爲img.ID =「MyButtonID」或類似的東西。

+0

我嘗試了一個按鈕的靜態名稱,結果相同。 – MarkyMarc 2010-06-07 19:37:14