簡體   English   中英

按鈕單擊事件不在ASP .Net中的使用控件內觸發

[英]Button click event not firing within use control in ASP .Net

我正在開發一個asp網頁,其中我有一個下拉組合框和一個占位符。 當用戶從下拉組合框中選擇項目時,對服務器端進行回發,並且服務器將asp用戶控件加載到該父頁面中的占位符。 到目前為止,一切都很好。

在用戶控件中,我有一個按鈕,后面的用戶控制代碼被實現來處理按鈕點擊事件。 問題是,當我單擊此按鈕時,我可以看到回發被發送到服務器端(即在調試模式下調用父頁面Page_Load()),但是用戶控件的Page_Load()或按鈕單擊事件處理程序都是沒有被調用。

請幫忙..

一些額外的信息,

  1. 我的父頁面不是asp母版頁。 只是一個簡單的asp頁面。
  2. 我正在使用VS2008和.Net 3.5 SP1和C#。

您需要確保UserControl存在,以便在重建viewstate時觸發按鈕單擊事件。

在Page_Load中加載UserControl將首次運行。 單擊按鈕並發生post_back時,尚未發生Page_Load。 這意味着UserControl將不存在,這意味着該事件無需連接備份按鈕。 因此,帶有按鈕的UserControl無法連接到click事件,並且click事件不會觸發。

建議您在此事件中加載您的用戶控件。

protected override void OnLoad(EventArgs e)
{
    base.OnLoad(e);
    //-- Create your controls here
}

嘗試沙盒測試 在page_load中,在Page_Load中動態創建一個帶有單擊事件的按鈕。 您將看到click事件不會觸發。 現在將按鈕移動到OnLoad事件。 點擊事件將觸發。 另請注意,click事件將發生在Page_Load事件之前。 進一步證明按鈕在正確的時間不存在。

另一個想法......

您正在按鈕事件發生之前在頁面上重新加載usercontrol。 確保LoadControl方法位於If塊內

if (!IsPostBack)
{
    //load usercontrol
}

Default.aspx的

<asp:PlaceHolder runat="server" ID="ph1">
</asp:PlaceHolder>

Default.aspx.cs

 protected void Page_Load(object sender, EventArgs e)
 {
     var ctl = LoadControl("Controls/UserControl.ascx");
     ph1.Controls.Add(ctl);
}

UserControl.ascx

<h3>User control</h3>
<asp:Button ID="btn1" runat="server" OnClick="btn1_Click" Text ="Click me" />

UserControl.ascx.cs

protected void btn1_Click(object s, EventArgs e)
{
    Response.Write("You clicked me, yay");
}

一切都像魅力。 當我點擊按鈕時,我看到“你點擊了我,yay”

關注點 如果您嘗試在下拉控件的SelectedItemChanged事件的處理程序中動態加載控件,則它將失敗,因為生命周期對ASP.Net頁面起作用的方式。 相反,您應該在頁面的PageLoad事件中處理此類控件創建,例如Default.aspx下面的示例

<asp:DropDownList ID="ddl1" runat="server" AutoPostBack="true">
    <asp:ListItem Value="0" Text="--select a value--" />
    <asp:ListItem Value="1" Text="User control 1" />
    <asp:ListItem Value="2" Text="User control 2" />
</asp:DropDownList>
<asp:PlaceHolder runat="server" ID="ph1">
</asp:PlaceHolder>   

Default.aspx.cs

protected void Page_Load(object sender, EventArgs e)
{
    if (IsPostBack)
    {
        switch (ddl1.SelectedValue)
        {
            case "1":
                var ctl = LoadControl("Controls/UserControl.ascx");
                ph1.Controls.Add(ctl);
                break;
            case "2":
                ctl = LoadControl("Controls/UserControl2.ascx");
                ph1.Controls.Add(ctl);
                break;
        } 
    }
}

在我的特定情況下,我發現問題是UserControl ID(或者更確切地說是缺少)。

首次實例化UserControl時,我的按鈕ID為ctl00 $ ctl02 $ btnContinue,但在回發后它已更改為ctl00 $ ctl03 $ btnContinue,因此按鈕事件處理程序未觸發。

我改為使用固定ID添加我的UserControl,現在按鈕總是加載ID為ctl00 $ myUserControl $ btnContinue。

暫無
暫無

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

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