从后面的代码调用动态创建的控件

Posted

技术标签:

【中文标题】从后面的代码调用动态创建的控件【英文标题】:Calling Dynamically Created Control From Code Behind 【发布时间】:2016-06-24 07:07:01 【问题描述】:

我正在使用htmlGenericControl 方法动态创建一个控件,然后尝试在我的代码中向下几行调用该控件。显然,由于尚未实际创建此控件,因此代码会引发构建错误。有没有办法解决这个问题?这是我正在使用的代码:

foreach(string t in equipmentTypes)

    HtmlGenericControl li = new HtmlGenericControl("li");//Create html control <li>
    //Create the correct <li> for the equipment type. Using the naming convention tableAbreviation_recordName eg: et_ATV.
    li.InnerHtml = "<div id='et_" + t +"' >" + t + "<label><input type='checkbox'></label></div><ul id='make' runat='server'>";
    equipmentType.Controls.Add(li);


makes = Statements.GetMake();

foreach(string t in makes)

    HtmlGenericControl li = new HtmlGenericControl("li");//Create html control <li>
    //Create the correct <li> for the equipment type. Using the naming convention tableAbreviation_recordName eg: et_ATV.
    li.InnerHtml = "<div id='mk_" + t + "' >" + t + "<label><input type='checkbox'></label></div>";
    make.Controls.Add(li);

所以我正在使用 id='make' 创建&lt;ul&gt;。我想在下一个 foreach 循环中调用这个&lt;ul&gt; 并附加一些 html 到它。我该怎么办?

经过一些额外的研究,我尝试了Page.FindControl 来查找控件,但是按照代码运行/页面创建的顺序,对象没有设置为对象的实例。所以看起来我可能需要在页面呈现后调用控件?

我用来尝试查找控件的代码与前面的foreach循环相同,除了最后一行。

foreach(string t in makes)
                
                    HtmlGenericControl li = new HtmlGenericControl("li");//Create html control <li>
                    //Create the correct <li> for the equipment type. Using the naming convention tableAbreviation_recordName eg: et_ATV.
                    li.InnerHtml = "<div id='mk_" + t + "' >" + t + "<label><input type='checkbox'></label></div>";
                    Page.FindControl("ATV_make").Controls.Add(li);
                

【问题讨论】:

你能把代码贴在你试图找到这个控件的地方吗? 已更新。我实际上继续尝试使用 ASP:Repeater 控件。我仍然没有它的工作。 您在哪里创建 ID 为“ATV_make”的控件? 对不起,我想我没有正确解释那部分。正在回收的数据库中的值将是 ATV。但我已经找到了使用中继器的解决方法。不过还是谢谢你的回复。 【参考方案1】:

经过一番研究,我找到了一个名为 Repeater 的 ASP.NET 控件。这在创建动态 ul 时非常有用。

这是我用来从我的数据库中动态加载值的代码。

<asp:Repeater ID="Repeater1" runat="server">
        <HeaderTemplate><ul></HeaderTemplate>
        <ItemTemplate><li><div id="et_"><%# Eval("EquipmentTypeName") %><label><input type="checkbox"></label></div><ul id="_make" runat="server">
            <asp:Repeater ID="Repeater2" runat="server" DataSourceID="SQL_Make">
                <ItemTemplate>
                    <li><div id="mk_"><%# Eval("MakeName") %><label><input type="checkbox"></label></div><ul id="_year" runat="server"></ul></li>
                </ItemTemplate>
            </asp:Repeater>
        </ul></li></ItemTemplate>
        <FooterTemplate></ul></FooterTemplate>
    </asp:Repeater>

【讨论】:

以上是关于从后面的代码调用动态创建的控件的主要内容,如果未能解决你的问题,请参考以下文章

具有动态创建控件的 MFC 应用程序突然停止响应

如何将值从一个表单传递到另一个表单的动态创建的控件

delphi动态增加page

winform用户控件动态创建添加控件timer控件控件联动

动态设置网格列/行宽/高

在 Blazor 中引用动态创建的控件