在 ListView EmptyDataTemplate 中查找控件
我有一个像这样的 ListView
<asp:ListView ID="ListView1" runat="server">
<EmptyDataTemplate>
<asp:Literal ID="Literal1" runat="server" text="some text"/>
</EmptyDataTemplate>
...
</asp:ListView>
在 Page_Load()
中我有以下内容:
Literal x = (Literal)ListView1.FindControl("Literal1");
x.Text = "other text";
但 x
返回 null
。 我想更改 Literal
控件的文本,但我不知道该怎么做。
I have the a ListView
like this
<asp:ListView ID="ListView1" runat="server">
<EmptyDataTemplate>
<asp:Literal ID="Literal1" runat="server" text="some text"/>
</EmptyDataTemplate>
...
</asp:ListView>
In Page_Load()
I have the following:
Literal x = (Literal)ListView1.FindControl("Literal1");
x.Text = "other text";
but x
returns null
. I’d like to change the text of the Literal
control but I don’t have no idea how to do it.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
我相信,除非您在代码后面的某个位置调用
ListView
的DataBind
方法,否则ListView
永远不会尝试数据绑定。 然后什么都不会呈现,甚至Literal
控件也不会被创建。在您的
Page_Load
事件中尝试以下操作:I believe that unless you call the
DataBind
method of yourListView
somewhere in code behind, theListView
will never try to data bind. Then nothing will render and even theLiteral
control won’t be created.In your
Page_Load
event try something like:您可以使用以下内容:
You can use the following:
这不是您具体要求的,但执行此类操作的另一种方法是这样的:
其中 Foobar 在页面的代码隐藏文件中定义
It's not specifically what you asked, but another way to do that kind of thing is like this:
where Foobar is defined in your page's code behind file
另一种方法...
在代码隐藏中...
An alternative approach...
In code-behind...
...
...
回答 Broam 的问题“有没有办法在数据绑定方法中做到这一点?我宁愿不硬编码“controls[0]”,因为这太草率了”
不幸的是,我还没有找到不使用 Controls[0] 的方法。
在通常的Item事件(ItemDataBound或ItemCreate)中,您可以使用ListViewItemEventArgs的e.Item来获取ListViewItem。 在 DataBound 事件中,只有一个通用的 EventArgs。
最重要的是,似乎 ((Control)sender).FindControl("Literal1") 也不起作用(从树顶部的列表视图查找控件),因此使用 Controls[0] 。 FindControl(...)(从列表视图项中查找控件)。
Answering Broam's question "Is there any way to do this in the databound method? I'd rather not hardcode "controls[0]" as that's sloppy"
Unfortunately, I've not found a way to not use Controls[0].
In the usual Item events (ItemDataBound or ItemCreate), you can use e.Item of the ListViewItemEventArgs to get the ListViewItem. In the DataBound event, there's only a generic EventArgs.
And on top of that, it seems that ((Control)sender).FindControl("Literal1") doesn't work either (find control from the listview at the top of the tree), hence the use of Controls[0] .FindControl(...) (find control from the listviewitem).