在重复器内的Web表单中查找控件
本文关键字:表单 查找 控件 Web | 更新日期: 2023-09-27 17:53:27
我无法在另一个UserControl中的Repeater中找到Literal。
我有以下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>
这是放置在MasterPage和从另一个ContentPage,我试图找到"lit_NavActive"和隐藏它。
我正在使用这个:
Repeater rpt = ((Theme)Page.Master).FindControl("Navigation").FindControl("rpt_NavItem") as Repeater;
Literal lit = rpt.FindControl("lit_NavActive");
if (lit != null) { lit.Visible = false; }
它不工作,如果我做报告。Visible = false;这可以很好地隐藏整个中继器,所以我很接近,但未能找到中继器内部的文字(lit_NavActive)。什么好主意吗?
您需要找到RepeaterItem
上的控件,而不是Repeater
上的控件
foreach (var item in rpt.Items)
{
Literal lit = item.FindControl("lit_NavActive");
if (lit != null) { lit.Visible = false; }
}
请记住,Repeater
"重复"项,因此Repeater
中可能有多个字面量。上面的代码隐藏了所有的Literal
。
如果你需要隐藏一个"特定的",那么在循环中,你应该应用你的条件,并决定是显示还是隐藏它。
或者考虑使用Repeater
的ItemDataBound
事件
由于中继器是一个数据绑定控件,因此中继器的每一行将由一个名为"lit_NavActive"的文字组成。因此,它在页面上唯一地命名它们。如果您查看页面的源代码,您会注意到它们的命名是这样的:
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>
在打开和关闭控件时引起了一些问题。我建议切换到<asp:HyperLink>
。这将使一切更清晰,更容易处理。
<asp:Repeater id="rpt_NavItem" runat="server"
OnItemDataBound="rpt_OnItemDataBound">
<ItemTemplate>
<asp:HyperLink ID="hyp" runat="server"></asp:HyperLink>
</ItemTemplate>
</asp:Repeater>
然后在ItemDataBound
处理程序中,设置HyperLink的属性,而不是字面量。
protected void rpt_OnItemDataBound(object sender, RepeaterItemEventArgs e)
{
HyperLink hyp = (HyperLink)e.Item.FindControl("hyp");
hyp.NavigateUrl = // your lit_Url value (ex. "http://www.google.com")
hyp.CssClass = // your lit_NavActive value (ex. "active")
hyp.Text = // your lit_Title value (ex. "Google")
}
然后回到原来的foreach
循环,找到HyperLink代替。
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")) %.' />
在本例中,如果设置值不是有效的布尔值,我将使用它将控件变为红色