【发布时间】:2020-02-06 19:12:11
【问题描述】:
我正在尝试追查为什么 DataBind() 确实会在 Repeater 上触发数据绑定事件,但没有注入子控件(其 ItemTemplate 标记内的子控件)。
<asp:Repeater ID="rptMessages" runat="server">
<asp:ItemTemplate>
<VallisLive2:NotificationWidget ID="ctlNotification" runat="server"
NotificationID='<%# Eval("NotificationID") %>'
Title='<%# Eval("Title") %>'
Details='<%# Eval("Details") %>'
CreatedDateTime='<%# Eval("CreatedDateTime") %>'
Importance='<%# Eval("Importance") %>' />
</asp:ItemTemplate>
</asp:Repeater>
上面的结果是,虽然没有错误,但Repeater内部什么也没有出现。
我可以证明 DataSource 包含项目,如果我尝试这样做:
<asp:Repeater ID="rptMessages" runat="server" OnItemDataBound="rptMessages_ItemDataBound">
事件触发并且数据值存在,但这确认没有创建中继器内的子控件,因为此问题的已知解决方法是手动设置值,如下所示:
protected void rptMessages_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
if (e.Item.ItemType == ListItemType.Item ||
e.Item.ItemType == ListItemType.AlternatingItem)
{
var n = e.Item.DataItem as Notification;
var control = e.Item.FindControl("ctlNotification") as NotificationWidget;
失败:System.NullReferenceException:“对象引用未设置为对象的实例。” 控制为空。它无法在 Repeater 中找到控件,因为它没有被创建,因为它试图绑定它。
所以DataBind()起作用了,它触发了,它有有效的源数据,但最终结果是Repeater的输出为空,以上证明Repeater没有创建子控件。
任何想法都非常感谢:)
【问题讨论】:
-
显然昨天过得不好。答案是在Repeater 中声明
而不是 。 -
Load_Event 描述数据的一些例子 con.Open(); rptmessage.DataSource = cmd.ExecuteReader(); rptmessage.DataBind(); con.Close();