2012-07-06 53 views
0

我有一個使用母版頁的asp頁面。我通過AJAX調用在頁面後面的代碼上的[Webmethod]創建了幾個面板。這裏是網頁本身的結構...FindControl不能與動態創建的控件一起工作

<form runat="server" class="form-horizontal" id="frm_estRequest"> 
    <div id="mainContent" runat="server" > 
    <div id="contentInner" runat="server> 
      <asp:Panel id="comp_list" runat="server"></asp:Panel> 
     </div> 
    </div> 
</form> 

我通過將WebMethod添加動態創建的控件到「comp_list」面板。這是在將WebMethod正在創建的HTML ...

Panel component = new Panel(); 
component.ID = "comp" + compNumber; 
component.Controls.Add(new LiteralControl("<input type='hidden' value='" + 
compType + "' ID='compType_" + compNumber + "'/>")); 

所以我試圖做的就是價值出來的HTML Hiddenfield的。這是我必須做的(因爲某些原因,這不起作用)。

ContentPlaceHolder cph =(ContentPlaceHolder)this.Master.FindControl("placeholder_content"); 
Control compList = (Control)cph.FindControl("frm_estRequest").FindControl("mainContent").FindControl("contentInner").FindControl("comp_list"); 
Control ct = (Control) compList.FindControl("comp" + i.ToString()); 
HiddenField compType = (HiddenField)ct.FindControl("compType_" + i.ToString()); 

我能夠得到「comp_list」控件,但這是我能得到的。它一直說ct爲空。僅供參考,我只是一個用於跟蹤已添加到頁面的控件的計數器。我唯一的想法是,也許我應該使用clientID。任何幫助,將不勝感激。

控件呈現爲HTML和然後通過AJAX返回到頁面,然後加入到像這樣在div ...

System.Text.StringBuilder sb = new System.Text.StringBuilder(); 
System.IO.StringWriter tw = new System.IO.StringWriter(sb); 
HtmlTextWriter hw = new HtmlTextWriter(tw); 
component.RenderControl(hw); 
return sb.ToString(); 

var req = $.ajax({ 
        type: "POST", 
        url: "EstRequest.aspx/createComponent", 
        data: params, 
        contentType: "application/json; charset=utf-8", 
        dataType: "json", 
        success: function (data) { 
          $('#<%= comp_list.ClientID%>').append(data.d) 
          document.getElementById('<%= compNumber.ClientID %>').value = comp + 1; 

          $("#<%= compNumber.ClientID %>").live("click", function() { 
          $(this).next().slideToggle("fast")}); 

          }, 
        error: function (response) { debugger; alert("Error: " + params); }, 
        failure: function (response) { 
         alert(response.d); 
        } 
       }) 
+3

您是否試圖在回發中找到控件?在搜索它們之前,您是否根據需要重新添加它們? – Oded 2012-07-06 19:46:23

+0

你在添加動態控件時會發生什麼事件?它必須在page_load之前完成,並且正如Oded所說,它們必須在回發中重新添加。 – TheGeekYouNeed 2012-07-06 19:51:38

+0

您的演員陣容將無法使用:HiddenField。你爲什麼要創建一個LiteralControl然後試圖找到它作爲一個HiddenField?當HiddenField呈現爲<輸入類型=「隱藏」>時,演員本身不起作用。只需添加一個新的隱藏域控件,然後嘗試對它執行findcontrol。 此外,您可以打開頁面級別的「跟蹤」,並查看控制樹以查找呈現的ID等(其可能是您的文字控件的ClientID呈現未設置爲靜態) – Richthofen 2012-07-06 19:59:42

回答

0

`面板組件=新面板(); component.ID =「comp」+ compNumber; (新的LiteralControl(「」));

//這裏添加一行

comp_list.Add(組件);`

現在就來試試它應該工作。

+0

我在這裏是新的,所以我沒有太多的格式化選項可用 – Sameer 2012-07-06 20:23:36

+0

我無法這樣做,因爲我在webmethod中創建它們。 – kjaenick 2012-07-06 20:30:30

+0

我沒有得到你將控件添加到「comp_list」面板的位置。我沒有看到它的代碼。此外webmethods是靜態的,所以我不認爲你可以從它添加asp.net控件。你應該使用腳本來嘗試它。 – Sameer 2012-07-06 20:40:32

相關問題