在转发器中查找Web窗体中的控件

时间:2015-06-04 14:18:19

标签: c# asp.net webforms repeater findcontrol

我无法在另一个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)。有什么想法吗?

3 个答案:

答案 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")) %.' />

在这种情况下,如果设置值不是有效的布尔值,我将使用它来将控件变成红色。