从转发器Asp.net C#之外的代码隐藏访问div

时间:2016-11-02 16:37:56

标签: c# asp.net repeater code-behind htmlgenericcontrol

我知道它可能不常见,但我希望在CodeBehind的ItemDataBound中将一个div(它在转发器之外)添加htmlGenericControl。

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>

3 个答案:

答案 0 :(得分:2)

与asp.net合作的时间太长了,但这可能会有所帮助

<div id="myDiv" runat="server">...</div>

并且在代码隐藏myDiv中应该是可访问的。

答案 1 :(得分:1)

此代码有几个问题。

首先,你的div只是客户端,从服务器端的角度来看,它只是一个字符串。使用以下命令将其转换为服务器端控件:

<div class="slider" runat="server" ID="slider">

其次,FindControl仅查找直接的孩子,在您的情况下,转发器项目的子项。 slider不是其中之一。此外,它不是转发器项目模板的一部分,应该可以像后面的代码一样访问,所以只需

slider.Controls.Add(...

除非slider并且您展示的转发器是某些其他模板的一部分,否则这将是#{1}}&#34;外部&#34;控制。在这种情况下,请确保使用&#34;外部&#34;控制以致电FindControl

最后,不要惹恼id。我敢打赌,这要么被ASP.NET覆盖,要么会导致页面出现问题。而是将客户端ID模式设置为静态并分配ID属性:

input.ClientIDMode = ClientIDMode.Static;
input.ID = string.Format("projectImage_{0}", item.ProjectImageId);

这最终会输出您需要的id相同的值,但是更符合ASP.NET的方式。但需要注意的是,我更换了#34; - &#34;用&#34; _&#34; - 服务器端控件在ID

中不能有连字符

答案 2 :(得分:1)

FindControl在另一个控件中找到一个控件,但这样做是为了寻找控件的id。你的“滑块”控件没有id,它使用一个名为“slider”但没有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);