まさに、以下の記事のようなことで悩んでいたので、まとめておく(まだ試してないけど)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