2010-10-21 100 views
0

我有在網絡用戶控制事件在用戶控制

第一個按鈕事件一個問題,我有這樣一個aspx:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="AddTest.aspx.cs" Inherits="AddTest" %> 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 

<html xmlns="http://www.w3.org/1999/xhtml"> 
<head runat="server"> 
    <title></title> 
    <script src="js/jquery-1.4.2.min.js" type="text/javascript"></script> 
</head> 
<body> 
    <form id="form1" runat="server"> 
    <asp:ScriptManager ID="ScriptManager1" runat="server"> 
    </asp:ScriptManager> 
    <div id="divContent" runat="server"> 
    </div> 
    </form>  
</body> 
</html> 

正如你看到的,我有一個ScriptManager做ASP.NET AJAX,ID爲divContent一個div加載控件,然後在後面的代碼:

protected void Page_Load(object sender, EventArgs e) 
{ 
    divContent.Controls.Add(LoadControl("~/thitai/addtest.ascx")); 
} 

我添加addtest.ascx到divContent你看,這是addtest.ascx

的代碼
<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="addtest.ascx.cs" Inherits="thitai.addtest" %> 
<asp:UpdatePanel ID="updatePanel" runat="server" ClientIDMode="Static"> 
    <ContentTemplate> 
     <input type="button" value="Load text" onclick="updPanel('text');return false;" /> 
     <input type="button" value="Load image" onclick="updPanel('image');return false;" /> 
     <asp:HiddenField ID="hftype" runat="server" ClientIDMode="Static" /> 
     <div> 
      <asp:PlaceHolder ID="plhControl" runat="server"></asp:PlaceHolder> 
     </div> 
     <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label> 
    </ContentTemplate> 
</asp:UpdatePanel> 
<script type="text/javascript"> 
    function updPanel(type) { 
     $("#hftype").val(type); 
     __doPostBack("updatePanel", ""); 
    } 
</script> 

每次我點擊加載文字按鈕,我改變hfType(隱藏字段)的值,然後做回發到使用的UpdatePanel服務器,那麼這背後

protected override void OnPreRender(EventArgs e) 
{ 
    string type = hftype.Value; 
    switch (type) 
    { 
       case "text": 
        plhControl.Controls.Add(LoadControl("~/thitai/test/text.ascx")); 
        break; 
       case "image": 
        plhControl.Controls.Add(LoadControl("~/thitai/test/image.ascx")); 
        break; 
       default: 
        plhControl.Controls.Add(LoadControl("~/thitai/test/text.ascx")); 
        break; 
    } 
    base.OnPreRender(e); 
} 

該代碼的代碼text.ascx

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="text.ascx.cs" Inherits="thitai.test.text" %> 
<%@ Register Assembly="Support" Namespace="Support.CustomEditor" TagPrefix="Editor" %> 
<Editor:CustomEditor ID="edNoidung" runat="server" NoScript="True" Content="" 
    Height="500" ActiveMode="Design" NoUnicode="True" InitialCleanUp="False" /> 
<div> 
    <asp:Button ID="Button1" runat="server" Text="Show HTML" 
     onclick="Button1_Click" /> 
</div> 
<div id="showHtml" runat="server"></div> 

和代碼text.ascx的背後

protected void Button1_Click(object sender, EventArgs e) 
{ 
    showHtml.InnerHtml = edNoidung.Content; 
} 

問題是:當我點擊button1時,頁面會使用AJAX進行回發,但事件Button1_Click不會發生火災!

對此有何想法?

回答

2

控制事件總是發生在Page/Control PreRender之前。但是,Button1在Page Prerender發生之前不存在(因爲您當時正在加載控件)。 要解決該問題,可以在頁面加載中移動加載控件(text.ascx),而不是預渲染。

編輯:或者,您可以在text.ascx page_load中嗅探請求數據以檢查按鈕是否已被點擊。例如,

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (Request.From[Button1.UniqueID] != null) 
    { 
     // button1 click, handle it 
     ... 
    } 
} 
+0

仍然不工作,請注意,我使用UpdatePanel回發! – 2010-10-21 08:57:36

+0

我仍然認爲它與事件執行的順序有關。但是,您可以嘗試其他方式來決定是否點擊了按鈕 -​​ 請參閱我的編輯答案。 – VinayC 2010-10-21 09:16:50

+0

你是對的,你的代碼工作完美,但事件Button1_Click仍然無法正常工作!還有一件事,就像你在我的text.ascx中看到的,我有一個編輯器,你可以將它改爲文本框,當我用一些文本填充它時,然後將它回發給服務器,我無法得到它! :( – 2010-10-21 09:58:42