在重复器内的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)。什么好主意吗?

在重复器内的Web表单中查找控件

您需要找到RepeaterItem上的控件,而不是Repeater上的控件

foreach (var item in rpt.Items)
{
   Literal lit = item.FindControl("lit_NavActive");
   if (lit != null) { lit.Visible = false; }
}

请记住,Repeater"重复"项,因此Repeater中可能有多个字面量。上面的代码隐藏了所有的Literal

如果你需要隐藏一个"特定的",那么在循环中,你应该应用你的条件,并决定是显示还是隐藏它。

或者考虑使用RepeaterItemDataBound事件

由于中继器是一个数据绑定控件,因此中继器的每一行将由一个名为"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")) %.' />

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