我试图追踪为什么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内部什么也没出现。
我可以证明数据源包含项,如果尝试这样做:
<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:'对象引用未设置为对象的实例。' 控件为空。尝试绑定它时,它在中继器内找不到控件,因为它没有被创建。
所以DataBind()可以工作,可以触发,它具有有效的源数据,但是最终结果是Repeater的输出为空,并且上面的结果证明了Repeater不会创建子控件。
任何想法都很感激:)
答案 0 :(得分:0)
昨天显然很糟糕。答案是声明,而不是在Repeater内部。