中继器未创建子控件

时间:2020-02-06 19:12:11

标签: c# asp.net

我试图追踪为什么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不会创建子控件。

任何想法都很感激:)

1 个答案:

答案 0 :(得分:0)

昨天显然很糟糕。答案是声明,而不是在Repeater内部。