【问题标题】:FindControl not working with dynamically created controlsFindControl 不适用于动态创建的控件
【发布时间】:2012-07-06 19:44:47
【问题描述】:

我有一个使用母版页的 asp 页面。我在页面上创建了几个面板,并通过 AJAX 调用我的代码隐藏页面上的 [Webmethod]。这是页面本身的结构...

<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>

我通过 web 方法将动态创建的控件添加到“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); 
                    } 
                }) 

【问题讨论】:

  • 您是否正在尝试查找回发控件?您在搜索之前是否按要求重新添加了它们?
  • 添加动态控件是什么事件?必须在 page_load 之前完成,正如 Oded 所说,它们必须在回发中添加回来。
  • 您的演员阵容将无法正常工作:HiddenField。你为什么要创建一个 LiteralControl 然后试图找到它作为一个 HiddenField?虽然 HiddenField 呈现为 <input type="hidden">,但转换本身不起作用。只需添加一个新的隐藏域控件,然后尝试对其进行查找控件。此外,您可以打开页面级别的“跟踪”并查看控件树以查找呈现的 ID 等(可能您的 literalcontrol 的 ClientID 呈现未设置为静态)
  • 正在使用按钮的单击事件创建控件。另外,我正在尝试在提交按钮单击事件上找到控件。谢谢!
  • 我已经进行了更改,因此现在我不尝试将文字转换为隐藏字段,但问题似乎在于获取“组件”面板。

标签: c# javascript asp.net ajax


【解决方案1】:

`面板组件 = new Panel();组件.ID = "comp" + compNumber; component.Controls.Add(new LiteralControl(""));

//这里加一行

comp_list.Add(component);`

现在试试应该可以了。

【讨论】:

  • 我是新来的,所以我不太了解可用的格式选项
  • 我无法这样做,因为我是在 web 方法中创建它们的。
  • 我没有得到您在“comp_list”面板中添加控件的位置。我没有看到它的代码。此外,webmethods 是静态的,所以我认为您不能从中添加 asp.net 控件。您应该使用脚本尝试一下。
  • $('#').append(data.d) 这行是我在我的javascript中添加控件的地方。
猜你喜欢
  • 1970-01-01
  • 2011-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多