我无法在另一个UserControl中的Repeater中找到Literal。
我有以下UserControl:
((TextView)mySpinner.getChildAt(0)).setTextColor(getResources().getColor(R.color.blue_text));
mySpinner.setEnabled(true);
mySpinner.setFocusable(true);
这是放在MasterPage和另一个ContentPage中,我试图找到“lit_NavActive”并隐藏它。
我正在使用它:
<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,它就无法正常工作;这样可以很好地隐藏整个转发器,所以我很接近但无法在Repeater中找到Literal(lit_NavActive)。有什么想法吗?
答案 0 :(得分:2)
您需要在RepeaterItem
上找到控件,而不是Repeater
自我
foreach (var item in rpt.Items)
{
Literal lit = item.FindControl("lit_NavActive");
if (lit != null) { lit.Visible = false; }
}
请记住Repeater
“重复”项目,因此Repeater
中可能有多个文字。上面的代码隐藏了所有Literal
s。
如果您需要隐藏“特定”,那么在循环中,您应该应用您的条件并决定是否显示或隐藏它。
或者考虑使用ItemDataBound
的{{1}}事件。
答案 1 :(得分:1)
由于转发器是数据绑定控件,转发器的每一行都包含一个名为“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;
}
}
答案 2 :(得分:0)
我已经看到了许多这样的答案,但我希望将转发器项中的控件从模板本身(在“ HTML”中)传递给方法。
我还没有看到这样做的答案,但是你可以做到:
Container.FindControl("lit_NavActive")
容器是您当前所在的RepeaterItem。
<asp:Checkbox id="chkValue" Checked='<%# GetCheckboxValue((CheckBox)Container.FindControl("chkValue"), Eval("SettingValue")) %.' />
在这种情况下,如果设置值不是有效的布尔值,我将使用它来将控件变成红色。