【问题标题】:Repeater not creating child controls中继器不创建子控件
【发布时间】: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();

标签: c# asp.net


【解决方案1】:

显然昨天过得很糟糕。答案是声明而不是在中继器内部。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多