【ASP.NET コントロール】ユーザーコントロール内のDropDownList(ドロップダウンリスト)の初期設定について

 まさに、以下の記事のようなことで悩んでいたので、まとめておく(まだ試してないけど)
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=36289&forum=7

概要

【ユーザーコントロールについて】
 * ユーザーコントロールに、DropDownListコントロールが含まれている
 * このユーザーコントロールのPage.Loadイベントで、このDropDownListのリストアイテムに項目を追加

【ユーザーコントロールを使用するPageについて】
 * 上記のユーザーコントロールをWebページに配置して、WebページのPage.LoadイベントでユーザーコントロールのDropDownList選択プロパティに値を設定している

 しかし、以下の順番でページのイベント処理が行われ、DropDownListに項目を追加する前にプロパティの設定が行われてしまっているため、ユーザーコントロールの選択項目を設定することができず、例外で落ちてしまう。

WebページのPage.Loadイベント
 →ユーザーコントロールのプロパティ設定(イベント)
   →ユーザーコントロールのPage.Loadイベント

解決策

まだ試してないけど、もう一工夫すれば、いけそうな気がする

 * ユーザーコントロールにPrivateな変数 _SelectIndex を追加。
 * ユーザーコントロールにPublicなプロパティ SelectIndex を追加。
 * ユーザーコントロールのロード時、 DropDown にアイテムがすべて追加された後、 DropDown の SelectIndex に _SelectIndex を設定してやる。

 * WebページのPage.Loadイベント時に このSelectIndex に値を設定してみてください。

サンプル

Public Class WebUserControl1
    Inherits System.Web.UI.UserControl

    Private _SelectIndex As Integer? = Nothing

    Public Property SelectIndex As Integer
        Set(value As Integer)
            Me._SelectIndex = value
        End Set
        Get
            Return Me._SelectIndex
        End Get
    End Property

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

        If Not Me.IsPostBack Then
            Dim items As String() = New String() {"item1", "item2", "item3"}

            Me.DropDownList1.DataSource = items
            Me.DropDownList1.DataBind()

            If Me._SelectIndex.HasValue Then
                ' 初期化
                Me.DropDownList1.SelectedIndex = Me._SelectIndex.Value
            End If
        End If

    End Sub
End Class

関連記事

ASP.NET】DropDownList (ドロップダウンリスト)

http://blogs.yahoo.co.jp/dk521123/25919321.html

ASP.NET】ユーザーコントロール内のDropDownList(ドロップダウンリスト)の初期設定について

http://blogs.yahoo.co.jp/dk521123/27933856.html