我知道这可能不寻常,但我想从CodeBehind将htmlGenericControl添加到ItemDataBound中的div(它在中继器之外(。。
HtmlGenericControl slider = (HtmlGenericControl)e.Item.FindControl("slider");
htmlGenericControl input = new HtmlGenericControl("input");
input.Attributes.Add("type", "radio");
input.Attributes.Add("name", "slide_switch");
input.Attributes.Add("id", string.Format("projectImage-{0}", item.ProjectImageId));
slider.Controls.Add(input);
但每次都返回null。这是aspx代码:
<div class="slider">
<asp:Repeater ID="rptProjectImages" runat="server" OnItemDataBound="rptProjectImages_ItemDataBound">
<ItemTemplate>
</ItemTemplate>
</asp:Repeater>
</div>
使用asp.net的时间太长,但这可能有助于
<div id="myDiv" runat="server">...</div>
并且在码尾CCD_ 1应该是可访问的。
此代码的几个问题。
首先,div只是客户端的,从服务器端的角度来看,它只是一个字符串。使用将其转换为服务器端控制
<div class="slider" runat="server" ID="slider">
其次,FindControl
只查找直属子项,在您的情况下是中继器项的子项。slider
不是其中之一。此外,它不是中继器项目模板的一部分,应该可以在代码背后访问,所以只有
slider.Controls.Add(...
除非slider
和您显示的中继器是某个"外部"控件的其他模板的一部分。在这种情况下,请确保使用"外部"控件调用上的FindControl
最后,不要惹id
。我打赌这要么会被ASP覆盖。NET,或者会导致页面出现问题。相反,将客户端ID模式设置为静态,并分配ID属性:
input.ClientIDMode = ClientIDMode.Static;
input.ID = string.Format("projectImage_{0}", item.ProjectImageId);
这最终会输出与您需要的id
相同的值,但在更多的ASP中。NET兼容的方式。不过需要注意的是,我用"_"替换了"-"-服务器端控件在ID 中不能有连字符
FindControl在另一个控件中查找控件,但查找控件的id。您的"滑块"控件没有id,它使用名为"滑块"的类,但没有id。
您需要将控件定义为
<div runat="server" id="Slider" class="slider">
<asp:Repeater ID="rptProjectImages" runat="server" OnItemDataBound="rptProjectImages_ItemDataBound">
<ItemTemplate>
</ItemTemplate>
</asp:Repeater>
</div>
runat="server"
告诉框架在代码后台实例化该控件。id将是作为该控件的对象的名称。然后在你的代码中,你可以进行
htmlGenericControl input = new HtmlGenericControl("input");
input.Attributes.Add("type", "radio");
input.Attributes.Add("name", "slide_switch");
input.ID = string.Format("projectImage-{0}", item.ProjectImageId);
Slider.Controls.Add(input);