簡體   English   中英

Asp.NET服務器控件回發

[英]Asp.NET Server Control Postback

我有一個想要創建的控件。 這是我要完成的一個簡單示例。

我希望控件包含一個按鈕。

Button b = new Button();
b.Text = "Test";
b.Click += new EventHandler(b_Click);

this.Controls.Add(b);

現在,控件呈現正常,按鈕顯示在頁面上。 我遇到的問題的核心是b_Click事件處理程序永遠不會被觸發。

protected void b_Click(object sender, EventArgs e)
{
    throw new NotImplementedException();
}

這里的任何幫助將不勝感激。 我不想在這里使用用戶控件純粹是出於自私的原因,並希望將其完全封裝在一個DLL中。

提前致謝。

編輯**

namespace ClassLibrary1
{
    [DefaultProperty("Text")]
    [ToolboxData("<{0}:WebCustomControl1 runat=server></{0}:WebCustomControl1>")]
    public class WebCustomControl1 : WebControl
    {

        protected override void CreateChildControls()
        {
            Button b = new Button();
                    b.ID = "button";
            b.Text = "Click Me";
            b.Click += new EventHandler(b_Click);

            this.Controls.Add(b);

            base.CreateChildControls();
        }

        protected void b_Click(object sender, EventArgs e)
        {
            this.Controls.Add(new LiteralControl("<p>Click!</p>"));
        }

    }
}

所以從評論中我試過這個。 最簡單的例子,仍然沒有去。 有什么東西我從根本上失蹤了嗎?

public class WebCustomControl1 : WebControl

需要

public class WebCustomControl1 : WebControl, INamingContainer

而已。 這就是使這個回發問題發揮作用所需要的一切。

覆蓋CreateChildControls方法並在該方法中創建/添加按鈕(並注冊處理程序)。

使用OnInit / OnLoad創建這樣的控件是不正確的,會導致行為不一致(例如您遇到的情況)。

編輯:您也可以嘗試設置button.ID,以便在每次回發時都是相同的,由於這個原因,凸起的事件可能沒有看到它。

請顯示您的控件類的定義。

您的控件是繼承自Control,WebControl還是CompositeControl。 嘗試繼承CompositeControl並查看是否有幫助。

因此,您的按鈕正確呈現到頁面並在用戶單擊時導致回發,但OnClick代碼永遠不會運行?

請記住,無論何時進行回發,您都要使用頁面類的全新實例。 回發過程的一部分正在運行用戶觸發的任何事件。 為此,asp.net處理器需要了解頁面生命周期中特定點的事件。 此時,您的按鈕必須已經在已注冊事件處理程序的頁面上 如果沒有發生這種情況,您的活動將不會觸發。 嘗試在頁面生命周期的早期移動按鈕創建。

這可能是在事件引發后很好地分配處理程序的情況。

處理控件時我的常見做法是:

  1. 使用Control.Init事件初始化所有內容(默認文本,處理程序,大小,組合等),並初始化子控件。
  2. 使用Control.Load事件來處理任何數據綁定操作(基於Init事件期間設置的屬性/字段)。

在回發之前和回發之后檢查按鈕控件的標識符。 如果它不相同,它將無法工作。

如果需要,您可以自己覆蓋標識符。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM