【问题标题】:Cannot access a control which is in the repeater , from the code behind无法从后面的代码访问中继器中的控件
【发布时间】:2011-12-08 16:15:57
【问题描述】:

我正在尝试从我的代码隐藏文件中访问 asp 中继器中的 asp 标签。这是我到目前为止所做的:

    <asp:Repeater ID="Repeater1" runat="server" DataSourceID="LinqDataSource1" OnItemDataBound="outerFunction">
        <HeaderTemplate>
            <h1>Questions And Answers</h1>
        </HeaderTemplate>

        <ItemTemplate>
             <p style="background-color:Red; color:Yellow;"><%#Eval("QText") %> :::::::::</p>
            <asp:HiddenField ID="HiddenField1" runat="server" Value='<%# setQID(Eval("QID"))%>' />

            <asp:Label ID="pageLabel" runat="server" Text="Label"></asp:Label>

             <asp:Repeater ID="Repeater1" runat="server" DataSourceID="LinqDataSource2">
                 <HeaderTemplate>

                 </HeaderTemplate>
                 <ItemTemplate>



                    <%# (GetAnswer(Eval("AnsQID"))) != 1 ? (displayAnswer(Eval("AText"))) : ""%>


                </ItemTemplate>

                <FooterTemplate>

                </FooterTemplate>

            </asp:Repeater>

            <span style="display:block; border-top:1px solid Gray;"></span>
        </ItemTemplate>
    </asp:Repeater>

*这是我的代码*

public void outerFunction(object sender, RepeaterItemEventArgs  e)
    {
       Label myLabel =  (Label) e.Item.FindControl("pageLabel");
       myLabel.Text = "HELLO World";
    }

我正在尝试显示问题和答案。每个问题都可以有多个答案。这就是为什么我将它放在嵌套的中继器控件中。现在我只需要知道我如何说例如在外部中继器中有一个“div”元素,并将我在内部中继器中获得的每个答案绑定到该父 div。

谢谢!

【问题讨论】:

  • 这只是一个建议,但在我看来,将事件处理程序命名为 _:Repeater1_ItemDataBound 更容易代码可读性。读名字就说明了一切。
  • 谢谢!下次我会记住这一点!

标签: c# asp.net repeater


【解决方案1】:

您的代码看起来不错,只是您没有检查您所在的行的类型:

public void outerFunction(object sender, RepeaterItemEventArgs  e)
 {
      if(e.Item.ItemType==ListItemType.Item || e.Item.ItemType==ListItemType.AlternatingItem)
      {
         Label myLabel =  (Label) e.Item.FindControl("pageLabel");
         myLabel.Text = "HELLO World";
      }
 }

【讨论】:

  • 非常感谢!这就是工作!这也适用于通用 html 控件吗?
  • @ShaneAdrianMuaz:是的,只要您将runat="server" 放在通用控件标记上即可。
  • 谢谢!在我的情况下,该方法是转发器的 OnItemDataBound。
【解决方案2】:

由于您有一个不包含“pageLabel”的标题模板,因此当转发器的该部分是数据绑定时,您将收到空引用错误。

将标签部分放在 if 块中:

if (e.Item.ItemType == ListItemType.Item)
{
...
}

如果您使用 AlternatingItemTemplate,您还需要包括:

if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
    {
    ...
    }

【讨论】:

    【解决方案3】:

    当当前处理的项目是页眉或页脚时,您现在的做法是不安全的,标签位于ItemTemplate,因此仅适用于 DataItems,请尝试如下:

    public void outerFunction(object sender, RepeaterItemEventArgs  e)
    {
        if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
        {
            Label myLabel =  (Label) e.Item.FindControl("pageLabel");
            myLabel.Text = "HELLO World";
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多