ユーザーコントロールに親ページからパラメータを与えても、先に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アクセサが先に実行されるようです。