查找内部控制的ListView控件(Find Control Inside ListView Con

2019-07-19 23:57发布

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

((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>

Answer 1:

列表视图是数据绑定控件; 所以它里面的控制将有不同的行不同的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;


Answer 2:

该功能将得到作者名称从数据库,你只需要打电话给你的方法来获取作者姓名,然后返回它

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" 


Answer 3:

它应该在arguement被LABEL1:

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

这应该是一个数据绑定事件。

http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.listview.itemdatabound.aspx



Answer 4:

试试吧:

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


Answer 5:

一个简单的解决这个问题,从而避免了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";
}


文章来源: Find Control Inside ListView Control