FindControl不能与动态创建的控件一起工作

问题描述:

我有一个使用母版页的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

`面板组件=新面板(); 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