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>

問題は、ASP.NETがImageIdを設定する前にPage_Loadが起動することです。デバッガーの助けを借りて、何らかの理由でMyControlのImageIdが設定されていることがわかりましたが、これはPage_Loadの処理が終了した後にのみ発生します。どうしたの?

4

1 に答える 1

10

おそらく、Page_Load が発生した後に ListView でのデータ バインディングが発生するため、その時点でプロパティが設定されていないためです。データバインディングが完了した後に呼び出されるため、コードを PreRender イベントに移動できます。

MSDNによる詳細情報:

PreRender -- このイベントが発生する前:

  • Page オブジェクトは、各コントロールおよびページに対して、EnsureChildControls を呼び出します。
  • DataSourceID プロパティが設定されている各データ バインド コントロールは、その DataBind メソッドを呼び出します。
于 2009-09-05T16:46:12.453 に答える