我有一个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;
答案 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;