2013-02-15 90 views
2

我想找到“ListView的”内部控制与ID =“标签”,“标签”的控制。我试着用下面的代码来做到这一点:查找控件内的ListView控件

((Label)this.ChatListView.FindControl("Label")).Text = "active"; 

但我得到这个异常:未设置为一个对象的实例对象引用。

这里有什么问题?

这是ASPX代码:

<asp:ListView ID="ChatListView" runat="server" DataSourceID="EntityDataSourceUserPosts"> 
    <ItemTemplate> 
     <div class="post"> 
      <div class="postHeader"> 
       <h2><asp:Label ID="Label1" runat="server" 
        Text= '<%# Eval("Title") + " by " + this.GetUserFromPost((Guid?)Eval("AuthorUserID")) %>' ></asp:Label></h2> 
       <asp:Label ID="Label" runat="server" Text="" Visible="True"></asp:Label> 
       <div class="dateTimePost"> 
        <%# Eval("PostDate")%> 
       </div> 
      </div> 
      <div class="postContent"> 
       <%# Eval("PostComment") %> 
      </div> 
     </div> 
    </ItemTemplate> 

</asp:ListView> 
+0

在页面加载方法 – TheChampp 2013-02-15 20:57:21

回答

5

列表视图是数据绑定控件;所以它内部的控件将针对不同的行具有不同的ID。你必须先检测行,然后抓住控制。最好抓住这样的控制是在像OnItemDataBound这样的事件中。在那里,你可以做到这一点抓住你的控制:

protected void myListView_ItemDataBound(object sender, ListViewItemEventArgs e) 
{ 
    if (e.Item.ItemType == ListViewItemType.DataItem) 
    { 
     var yourLabel = e.Item.FindControl("Label1") as Label; 

     // ... 
    } 
} 

如果你想抓住它Page_Load,你必须知道特定行和检索控制为:

var theLabel = this.ChatListView.Items[<row_index>].FindControl("Label1") as Label; 
1

这功能将从数据库获取作者姓名,您只需调用您的方法即可获取作者姓名然后将其返回即可

protected string GetUserFromPost(Guid? x) 
{ 
    // call your function to get Author Name 
    return "User Name"; 
} 

并且在列表视图中,你必须绑定标签做,在列表视图ItemDataBound事件

protected void ChatListView_ItemDataBound(object sender, ListViewItemEventArgs e) 
{ 
    if (e.Item.ItemType == ListViewItemType.DataItem) 
    { 
     Label lbl = e.Item.FindControl("Label") as Label; 
     lbl.Text = "Active"; 
    } 
} 

下面是列表视图ASPX代码修改(只需添加onitemdatabound="ChatListView_ItemDataBound"):

asp:ListView 
ID="ChatListView" 
runat="server" 
DataSourceID="EntityDataSourceUserPosts" 
onitemdatabound="ChatListView_ItemDataBound" 
0

试试:

protected void ChatListView_ItemDataBound(object sender, ListViewItemEventArgs e) 
{ 
    if (e.Item is ListViewDataItem) 
    { 
     var yourLabel = e.Item.FindControl("Label1") as Label; 
     // ... 
    } 
} 
1

一个简单的解决这个问题,从而避免了FindControl代码是把OnInit在标签上。

这将改变页面的代码如下:<asp:Label ID="Label" runat="server" Text="" Visible="True" OnInit="Label_Init"></asp:Label>

而且在你后面的代码现在有这样的功能:

protected void Label_Init(object sender, EventArgs e) 
{ 
    Label lblMyLabel = (Label)sender; 
    lblMyLabel.Text = "My Text"; 
}