【问题标题】:Cannot Find Label Control In Repeater Control在中继器控件中找不到标签控件
【发布时间】:2013-03-10 13:31:06
【问题描述】:

我想在后面的代码中使用 ID 为 TextLabel 的 Label 控件,但这给了我以下异常 Object reference not set to an instance of an object. 异常出现在代码后面文件中的这行代码上:

  Label label = e.Item.FindControl("TextLabel") as Label;

  string text = label.Text;

我在这里犯了什么错误?如何在后面的代码中找到“TextLabel”控件?

aspx代码:

<asp:Repeater ID="UserPostRepeater" runat="server" OnItemDataBound="UserPostRepeater_ItemDataBound">
    <HeaderTemplate>
    </HeaderTemplate>
    <ItemTemplate>

        <asp:Label ID="TextLabel" runat="server" Text="Label"></asp:Label>
    </ItemTemplate>
    <FooterTemplate>
    </FooterTemplate>
</asp:Repeater>

代码隐藏:

protected void UserPostRepeater_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
    BlogProfileEntities blogProfile = new BlogProfileEntities();
    Label label = e.Item.FindControl("TextLabel") as Label;
    string text = label.Text;
}

【问题讨论】:

  • 检查您的 html 输出。您可能会看到它给了它一个类似 TextLabel_1 的 ID,这就是您无法使用该 ID 找到它的原因。

标签: c# asp.net exception repeater


【解决方案1】:

使用ItemDataBound 时,您需要检查中继器项目的类型 - e.Item.ItemType。

它必须是ListItemType.Item 或ListItemType.AlternatingItem - 这些是标签所在的模板。

protected void UserPostRepeater_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
    BlogProfileEntities blogProfile = new BlogProfileEntities();

    if (e.Item.ItemType == ListItemType.Item || 
        e.Item.ItemType == ListItemType.AlternatingItem)
    {
      Label label = e.Item.FindControl("TextLabel") as Label;
      string text = label.Text;
    }
}

【讨论】:

  • 或者最好只检查 dataitem != null
  • @TomasVoracek - FindControl 很贵。最好只在可以合理预期它出现时才调用。
  • 为什么要在检查项目类型之前创建一个新实例?似乎很浪费资源。
  • @ShaiCohen - 该类型甚至没有在方法中使用 - 不妨问一下为什么要创建它。我只是根据发布的内容来举例说明。
【解决方案2】:

您必须在ItemDataBound 中检查正确的ItemType,因为每个 项目都会调用它,所以首先要检查Header。

protected void UserPostRepeater_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
     // This event is raised for the header, the footer, separators, and items.
      // Execute the following logic for Items and Alternating Items
      if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) 
      {
         Label label = e.Item.FindControl("TextLabel") as Label;
         string text = label.Text;
      }
}

【讨论】:

    【解决方案3】:

    您需要指定ItemType 的类型。这将适用于您的情况:

    protected void UserPostRepeater_ItemDataBound(object sender, RepeaterItemEventArgs e)
    {
        if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)  // Add this
        {
         Label label = e.Item.FindControl("TextLabel") as Label;
         string text = label.Text;
        }
    }
    

    【讨论】:

    • 为什么要在检查项目类型之前创建一个新实例?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-20
    • 1970-01-01
    • 1970-01-01
    • 2010-12-16
    • 1970-01-01
    • 1970-01-01
    • 2011-09-28
    相关资源
    最近更新 更多