C# 在repeater内的Web窗体中查找控件
我无法在另一个UserControl中的转发器中找到文本 我有以下用户控件: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
<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")) %.' />