在 ListView 控件中查找控件
Posted
技术标签:
【中文标题】在 ListView 控件中查找控件【英文标题】:Find Control Inside ListView Control 【发布时间】:2013-01-31 22:09:47 【问题描述】:我想在“ListView”控件中找到 ID =“Label”的“Label”控件。我试图用以下代码做到这一点:
((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>
【问题讨论】:
在页面加载方法中 【参考方案1】: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;
【讨论】:
【参考方案2】:这个函数会从数据库中获取作者姓名,你只需要调用你的方法获取作者姓名然后返回
protected string GetUserFromPost(Guid? x)
// call your function to get Author Name
return "User Name";
要在列表视图中绑定标签,您必须在列表视图ItemDataBound
Event 中进行绑定
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"
【讨论】:
【参考方案3】:在争论中应该是Label1:
((Label)this.ChatListView.FindControl("Label1")).Text = "active";
这应该在数据绑定事件中。
http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.listview.itemdatabound.aspx
【讨论】:
这应该在数据绑定事件中。【参考方案4】:试试看:
protected void ChatListView_ItemDataBound(object sender, ListViewItemEventArgs e)
if (e.Item is ListViewDataItem)
var yourLabel = e.Item.FindControl("Label1") as Label;
// ...
【讨论】:
【参考方案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";
【讨论】:
以上是关于在 ListView 控件中查找控件的主要内容,如果未能解决你的问题,请参考以下文章
listview点击item中的button改变item中的其它的控件的值