Kobarin's Development Blog

C#やASP.NET、公開APIなどについての記録です。

ユーザーコントロールに親ページからパラメータを与えても、先にPage_Loadイベントが呼び出されてしまう対策

まず一例として(コードは至るところでカットしてます)。
以下の例では、parent.aspx のRepeaterのアイテム内から、ユーザーコントロールuc.ascxを呼び出しています。
Repeaterの各アイテムには色名を指定すると、uc.ascxで「色は○○です。」と表示する、意味不明なサンプルです。

parent.aspx
<asp:Repeater ID="Repeater1">
  <itemTemplate>
    <uc1:MyControl ID="usercontrol1" runat="server" MyColor="青紫色" />
    <hr />
  </itemTemplate>
</asp:Repeater>
uc.ascx
色は<asp:Label ID="Label1" runat="server" Text="" />です。
uc.ascx.cs
using System;
using System.Collections.Generic;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

public partial class uc : System.Web.UI.UserControl
{
  string mycolor = "";

  protected void Page_Load(object sender, EventArgs e)
  {
    Label1.Text = mycolor;
  }

  public string MyColor{
    set { mycolor = value; }
  }
}

実行結果

実行すると、これでは動作しません。実行結果は以下の通り。

色はです。
色はです。
色はです。

原因と対策

変数mycolorに色名が渡されていないようです。
原因は、アクセサMyColorに値が渡される前に、Page_Initイベントが実行されてしまっているためです。
対策として正しいかどうか不明ですが、「Page_Init」を「Page_PreRender」に書き換える事でMyColorアクセサが先に実行されるようです。