在列表视图中获取标签的文本

时间:2014-08-06 07:01:35

标签: c# asp.net listview

我有一个listview控件,其中填充了数据库中的数据。我使用标签来显示该数据。现在我需要在其他地方使用该标签的值。我试图访问标签控件的文本值,但它说

  

对象引用未设置为对象的实例。

但我确实在标签上有价值。

<asp:ListView ID="msg_list" runat="server">
   <ItemTemplate>
    <table>
      <tr class="myitem">
        <td>
            <asp:Label ID="reg_id_reply" runat="server" Text="helo" Visible="false"  />
             <asp:Label role="menuitem" ID="msg_lbl" runat="server" text='<%#Eval("msg")%>' /><i style=" color:Gray; " >  from   
             <asp:Label ID="tme" runat="server" Text='<%#Eval("name")%>' />
             <i> on </i>
             <asp:Label ID="tmelbl" runat="server" Text='<%#Eval("tme")%>'/>
              <a id="msg-reply" class="btn button" data-toggle="modal" data-target="#msg-rply" style="cursor:pointer;" ><i class="glyphicon glyphicon-share-alt white"> </i></a>  </td>

              <hr style=" margin-top:1px; margin-bottom:1px; " />
      </tr>
     </table>
     <%--<hr style=" margin-top:1px; margin-bottom:1px; " />--%>
   </ItemTemplate>
  </asp:ListView>

这就是我试图访问标签文本的方式。请注意,下面的代码位于按钮点击事件onClick的内部。

Label mylbl = (Label)msg_list.FindControl("reg_id_reply");
string rid = mylbl.Text;

1 个答案:

答案 0 :(得分:0)

根据Control.FindControl Method (String)的说明:

  

仅当控件直接包含在指定的容器中时,此方法才会找到控件。

您的标签所包含的直接容器是ItemTemplate。因此,如果您从列表视图开始,则可能需要为标签构建递归搜索。您可以尝试从this MSDN page建议的以下代码:

private Control FindControlRecursive(Control rootControl, string controlID)
{
    if (rootControl.ID == controlID) return rootControl;

    foreach (Control controlToSearch in rootControl.Controls)
    {
        Control controlToReturn = FindControlRecursive(controlToSearch, controlID);
        if (controlToReturn != null) return controlToReturn;
    }
    return null;
}

但是请注意,listview可能会更改项模板中组件的id值。如果您知道所需的项目索引,则可以使用this post中建议的方法:

var theLabel = this.ChatListView.Items[<item_index>].FindControl("reg_id_reply") as Label;