atsukanrockのブログ

Microsoft系技術を中心にぼちぼち更新します

Control.Initイベント内でのプロパティ変更

コントロールのInitイベント内でプロパティを変更しても、その変更はViewStateに記録されない。(『Control.Init イベント (System.Web.UI)』の「解説」に記述あり)結果、HTTPリクエストを跨ると、そのプロパティ変更が失われる。
例えば以下のコードの場合:

// lblHoge:Labelコントロール
void lblHoge_Init(Object sender, EventArgs e)
{
    if (!Page.IsPostBack)
    {
        lblHoge.CssClass = "hoge";
    }
}

ページの非ポストバック時の表示では、lblHogeのCssClassは"hoge"となるが、ページがポストバックされ、再表示された時には""となる。
プロパティ変更をViewStateに記録するには、コントロールのLoadからPreRenderの間のイベント(Load、PreRenderを含む)でプロパティ値を設定する。なお、その際にはコントロールがHTMLレンダリングされない場合にはPreRenderイベントが発生しないことにも注意が必要。