まさに、以下の記事のようなことで悩んでいたので、まとめておく(まだ試してないけど)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参考文献
* 今後役に立ちそうなページをのせておく
イベント順
http://msdn.microsoft.com/ja-jp/library/ie/ms178472.aspxhttp://www.agile-tech.com/blogs/dev/2008/08/aspnet-event.html
Control.EnsureChildControls メソッド
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=36350&forum=7http://msdn.microsoft.com/ja-jp/library/system.web.ui.control.ensurechildcontrols%28v=vs.80%29.aspx