6

我想在“ListView”控件中找到 ID =“Label”的“Label”控件。我试图用以下代码做到这一点:

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

但我得到了这个例外:Object reference not set to an instance of an object

这里有什么问题?

这是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>
4

5 回答 5

6

Listview 是一个数据绑定控件;所以它里面的控件对于不同的行会有不同的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;
于 2013-02-15T21:06:42.647 回答
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" 
于 2013-04-11T10:48:12.270 回答
1

在争论中应该是 Label1:

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

这应该在数据绑定事件中。

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

于 2013-02-15T20:55:58.867 回答
1

试试看:

protected void ChatListView_ItemDataBound(object sender, ListViewItemEventArgs e)
{
    if (e.Item is ListViewDataItem)
    {
         var yourLabel = e.Item.FindControl("Label1") as Label;
         // ...
    }
}
于 2015-09-04T10:00:41.040 回答
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";
}
于 2016-03-31T20:42:58.733 回答