2011-09-19 16 views
0

私のWebページで、私はusercontrolのインスタンスを複数読み込んでいます。投稿の往復のプロパティの束を保存する必要がありますが、ViewStateにそれらのプロパティを保存し、それらをusercontrol内のリピータ項目に再度設定する方法について混乱しています。動的に追加されたusercontrolでViewStateを使用することについて混乱しました

は、誰もがこのような状況で私を助けることができる、私はのViewStateのMSDNを読みましたが、私はこれは私が子コントロールが同じにロードされている(親ユーザーコントロールをロードする方法で、何らかの理由

のために非常によくそれを理解していないです同じユーザーコントロールを使用する)

Protected Sub Load_Controls(ByVal list As List(Of BSEvaluationGroup.category), ByVal gid As Integer, ByVal pid As Integer, ByVal fid As Integer) 
    Dim item As BSEvaluationGroup.category 
    For Each item In list 
     Dim ctl As PerformanceEvaluationSubcontractorControl = CType(Page.LoadControl("PerformanceEvaluationSubcontractorControl.ascx"), PerformanceEvaluationSubcontractorControl) 
     ctl.categoryid = item.catid 
     ctl.categoryname = item.catname 
     ctl.projectid = pid 
     ctl.folderid = fid 
     ctl.groupid = gid 
     ctl.parentid = item.parid 
     ctl.clist = item.categories 
     ctl.plist = item.points 
     ctl.parentpage = Me 
     ctl.EnableViewState = "true" 
     If (Not subcon Is Nothing AndAlso Not subcon.points Is Nothing) Then 
      ctl.epnts = subcon.points 
     End If 
     AddHandler ctl.BubbleCalculate, AddressOf Me.PostRating 

     Select Case gid 
      Case 1 
       Me.officephld.Controls.Add(ctl) 
       Dim ohrule As HtmlGenericControl = New HtmlGenericControl("hr") 
       ohrule.Style.Add("width", "100%") 
       ohrule.Style.Add("background-color", "Silver") 
       ohrule.Style.Add("size", "1px") 
       ohrule.Style.Add("border-width", "0") 
       ohrule.Style.Add("padding-top", "1px") 
       ohrule.Style.Add("float", "left") 
       Me.officephld.Controls.Add(ohrule) 
      Case 2 
       Me.sitephld.Controls.Add(ctl) 
       Dim shrule As HtmlGenericControl = New HtmlGenericControl("hr") 
       shrule.Style.Add("width", "100%") 
       shrule.Style.Add("background-color", "Silver") 
       shrule.Style.Add("size", "1px") 
       shrule.Style.Add("border-width", "0") 
       shrule.Style.Add("padding-top", "1px") 
       shrule.Style.Add("float", "left") 
       Me.sitephld.Controls.Add(shrule) 
     End Select 
    Next 
End Sub 
+0

を追加し、あなたが動的にユーザーコントロールを作成する方法私たちを表示します。 UserControlのサーバーコントロール(f。TextBox)としてそれらのプロパティを追加できません。このようにして、これらのプロパティは自動的にViewStateに格納されます。それ以外の場合は、手動で追加するだけです。 'ViewState(" MyProperty1 ")= value' –

+0

コントロールをロードするコードを追加しました。 "ctl.epnts = subcon.points"は、リピータにロードされているAjaxControlToolKit評価コントロールに使用されます。 – mattgcon

+0

...そしてどこで 'Load_Controls'を呼び出していますか?以前と同じIDでポストバックしてもリロードする必要があることに注意してください。 –

答えて

0

のようなものである必要があり、私はそれを取り除く代わりにID

0

ViewState("PropertyName")のように表示状態へのアクセスは簡単です。ビューステートバッグはコントロールインスタンスに固有であるため、複数のコントロールタイプとインスタンス内で同じプロパティ名を使用できます。

ここで重要なのは、ASp.NETの実行時にインスタンスを制御するためにビューステートバッグと一致させる必要があることと、IDプロパティ(親命名コンテナ内で一意)を使用することです。そのため、動的なユーザーコントロールインスタンスに一意のIDを割り当てることが重要です(ポストバックで同じコントロールツリー階層とIDを維持する - 本質的に、ポストバックで同じコードを実行し、ランダムIDを使用しないことを意味します)。だからあなたのコードは、それがコントロールIDを発行した

... 
Dim n As Integer 
n = 1 
For Each item In list 
     Dim ctl As PerformanceEvaluationSubcontractorControl = CType(Page.LoadControl("PerformanceEvaluationSubcontractorControl.ascx"), PerformanceEvaluationSubcontractorControl) 
     ctl.ID = "MyCtl" & n.ToString() 
     ctl.categoryid = item.catid 
.... 
+0

私はユニークなID(ctl.ID = item.groupid&item.catid)へのユーザーコントロールが、ポストバックでは、Viewstateには何もありません – mattgcon

+0

以下のメソッドは、リピータ内のレーティングコントロール値の変更に使用されます。Protected Sub pntrating_ChangedオブジェクトとしてByVal送信者、AjaxControlToolkit.RatingEventArgsとしてByVal E)AjaxControlToolkit.Rating = ctype関数(送信者として 薄暗いのCTL、AjaxControlToolkit.Rating)= ctl.ClientID e.CallbackResult = e.Value End Subの のViewState(ctl.ClientID) – mattgcon

+0

@mattgcon、IDがコントロールツリーヒイラキー全体に存在することを確認するユーザーコントロールの親にはIDなどがあります。それ以外は、あなたのユーザコントロールをページ/親にどこに追加していますか? 'Load_Controls'はそのようなコードを持っていません。それにもかかわらず、ページにコントロールを追加する前にIDを割り当てる必要があります。 – VinayC

関連する問題