【问题标题】:Find control in Web Forms inside a repeater在转发器内的 Web 窗体中查找控件
【发布时间】:2015-08-19 05:06:48
【问题描述】:

我无法在另一个 UserControl 中的 Repeater 中找到 Literal。

我有以下用户控件:

<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; }

如果我执行 rpt.Visible = false; 则它不起作用这可以很好地隐藏整个中继器,所以我很接近但无法在中继器内找到文字(lit_NavActive)。有什么想法吗?

【问题讨论】:

    标签: c# asp.net webforms repeater findcontrol


    【解决方案1】:

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

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

    请记住,Repeater“重复”项目,因此您的 Repeater 中可能有多个文字。上面的代码会隐藏所有的Literals。

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

    或者考虑使用RepeaterItemDataBound 事件。

    【讨论】:

      【解决方案2】:

      由于转发器是数据绑定控件,因此转发器的每一行都包含一个名为“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>
      

      导致控件的打开和关闭出现一些问题。我建议切换到&lt;asp:HyperLink&gt;。这将使一切变得更干净,更容易处理。

      <asp:Repeater id="rpt_NavItem" runat="server" 
          OnItemDataBound="rpt_OnItemDataBound">
          <ItemTemplate>
              <asp:HyperLink ID="hyp" runat="server"></asp:HyperLink>
          </ItemTemplate>
      </asp:Repeater>
      

      然后在您的 ItemDataBound 处理程序中,设置超链接的属性而不是文字。

      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; 
          }
      }
      

      【讨论】:

      • 还是找不到。我在 web.config 中有 clientIDMode="Static" 所以所有服务器 ID 都没有 (ctl) 前缀。呈现的控件: 注意 Cats 锚点中的类,每个 Item 都存在文字,但大多数时候它的文本设置为空。上面建议的代码不起作用,我想知道为什么。
      • 所以 lit_NavActive 的文本类似于class="active"?
      • 正确,或完全空白。
      • 那么您在哪里实际设置文本,rpt_OnItemDataBound?我不知道这是在哪里完成的。
      • 是的,((Literal)e.Item.FindControl("lit_NavActive")).Text = " class=\"active\"";
      【解决方案3】:

      我已经看到了很多这样的答案,但我希望将转发器项中的控件从模板本身(在“HTML”中)传递给一个方法

      我还没有看到这样做的答案,但你可以做到:

      Container.FindControl("lit_NavActive")
      

      Container 是你当前所在的RepeaterItem。

      <asp:Checkbox id="chkValue" Checked='<%# GetCheckboxValue((CheckBox)Container.FindControl("chkValue"), Eval("SettingValue")) %.' />
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-05-27
        • 1970-01-01
        • 2011-04-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多