10

这真让我抓狂。

我有一个非常简单的用户控件:

public int? ImageId {set; get;}

protected void Page_Load(object sender, EventArgs e)
{
     ... do something with ImageId...
}

然后我把这个控件放在 UpdatePanel 中的 ListView 页面上:

<asp:ListView ID="ListViewImages"  runat="server" DataSourceID="src">
  <LayoutTemplate>
    <asp:PlaceHolder ID="itemPlaceholder" runat="server" />
  </LayoutTemplate>
  <ItemTemplate>
    <My:MyControl ImageId='<%# Eval("Id") %>' ID="cipPreview" runat="server"  />
  </ItemTemplate>
</asp:ListView>

问题是 Page_Load 在 ASP.NET 设置 ImageId 之前触发。在调试器的帮助下,我发现由于某种原因 MyControl 中的 ImageId 已设置,但它仅在 Page_Load 完成处理后才会发生。怎么了?

4

1 回答 1

10

这可能是因为 ListView 上的数据绑定发生在 Page_Load 触发之后,因此此时您的属性未设置。您可以将代码移动到 PreRender 事件,因为它是在数据绑定完成后调用的。

根据MSDN的更多信息:

PreRender -- 在此事件发生之前:

  • Page 对象为每个控件和页面调用 EnsureChildControls。
  • 每个设置了 DataSourceID 属性的数据绑定控件都会调用其 DataBind 方法。
于 2009-09-05T16:46:12.453 回答