Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/262.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在repeater内的Web窗体中查找控件_C#_Asp.net_Webforms_Repeater_Findcontrol - Fatal编程技术网

C# 在repeater内的Web窗体中查找控件

C# 在repeater内的Web窗体中查找控件,c#,asp.net,webforms,repeater,findcontrol,C#,Asp.net,Webforms,Repeater,Findcontrol,我无法在另一个UserControl中的转发器中找到文本 我有以下用户控件: <nav role="navigation"> <ul> <li><a href="/"<asp:Literal id="litNavHomeActive" runat="server" />>Home</a></li> <asp:Repeater id="rpt_NavItem" runat="server" OnIte

我无法在另一个UserControl中的转发器中找到文本

我有以下用户控件:

<nav role="navigation">
<ul>
    <li><a href="/"<asp:Literal id="litNavHomeActive" runat="server" />>Home</a></li>
<asp:Repeater id="rpt_NavItem" runat="server" OnItemDataBound="rpt_OnItemDataBound">
<ItemTemplate>
    <li><a href="/<asp:Literal id="lit_Url" runat="server" />/"<asp:Literal id="lit_NavActive" runat="server" />><asp:Literal id="lit_Title" runat="server" /></a></li>
</ItemTemplate>
</asp:Repeater>
</ul>
<div class="cb"></div>
</nav>

如果我做rpt.Visible=false,它就不起作用了;这在隐藏整个中继器时效果很好,所以我很接近,但在中继器中找不到文本(lit_NavActive)。有什么想法吗?

您需要在
中继器项上找到控件,而不是在
中继器上找到控件

foreach (var item in rpt.Items)
{
   Literal lit = item.FindControl("lit_NavActive");
   if (lit != null) { lit.Visible = false; }
}
请记住,
转发器“重复”项目,因此在
转发器中可能有多个文本。上面的代码将隐藏所有的
Literal
s

如果需要在上隐藏“特定的”,那么在循环中,您应该应用您的条件并决定是显示还是隐藏它


可选地考虑使用<代码> ITEMDATABONE 事件>代码>中继器< /代码> .< /P> < P>因为中继器是一个数据绑定控件,中继器的每一行将由一个名为“LITIVAWAcActuple”的文字组成。因此,它在页面上对它们进行了唯一的命名。如果查看页面的源代码,您会注意到它们的名称如下:

rpt_NavItem_ctl101_lit_NavActive
rpt_NavItem_ctl102_lit_NavActive
rpt_NavItem_ctl103_lit_NavActive
因此,当您试图在整个中继器上查找“lit_NavActive”时,它找不到它,因为“lit_NavActive”不存在。您需要做的是在中继器的一行中找到“lit_NavActive”

foreach(RepeaterItem item in rpt_NavItem.Items)
{
    Literal lit_NavActive = (Literal)item.FindControl("lit_NavActive");
    if (lit_NavActive != null) 
    { 
        lit_NavActive.Visible = false; 
    }
}
编辑:所有这些内容都有可能:

<li><a href="/<asp:Literal id="lit_Url" runat="server" />/"<asp:Literal id="lit_NavActive" runat="server" />><asp:Literal id="lit_Title" runat="server" /></a></li>
然后回到原来的
foreach
循环,找到超链接

foreach(RepeaterItem item in rpt_NavItem.Items)
{
    HyperLink hyp = (HyperLink)item.FindControl("hyp");
    if (hyp != null) 
    { 
        hyp.Visible = false; 
    }
}

我已经看到了很多这样的答案,但我希望将repeater项中的控件从模板本身(在“HTML”中)传递到一个方法中

我还没有看到这样做的答案,但你可以做到:

Container.FindControl("lit_NavActive")
容器是您当前所在的RepeaterItem

<asp:Checkbox id="chkValue" Checked='<%# GetCheckboxValue((CheckBox)Container.FindControl("chkValue"), Eval("SettingValue")) %.' />


在本例中,如果设置值不是有效的布尔值,我使用它将控件变成红色。

仍然找不到它。我在web.config中有clientdmode=“Static”,所以所有服务器ID都没有(ctl)前缀。呈现的控件:
    • 请注意,在Cats锚中的类中,每个项都存在文本,但大多数情况下其文本设置为空。上面建议的代码不起作用,我想知道为什么。因此,lit_NavActive的文本可能类似于
      class=“active”
      ?正确,或者完全为空。那么,在
      rpt\u OnItemDataBound
      中,您实际在哪里设置文本?我看不出这是在哪里做的。是的,使用
      ((Literal)e.Item.FindControl(“lit\u NavActive”))。Text=“class=”active\”
      
      foreach(RepeaterItem item in rpt_NavItem.Items)
      {
          HyperLink hyp = (HyperLink)item.FindControl("hyp");
          if (hyp != null) 
          { 
              hyp.Visible = false; 
          }
      }
      
      Container.FindControl("lit_NavActive")
      
      <asp:Checkbox id="chkValue" Checked='<%# GetCheckboxValue((CheckBox)Container.FindControl("chkValue"), Eval("SettingValue")) %.' />