2011-01-10 15 views
1

親コントロールにHiddenField子コントロールのインスタンスがあります。私はそれを追加するCreateChildControls()を使用しています。すべてが、フィールドに追加される値を含むクライアント側で動作します。しかし、ポストバックに、フィールドへの参照が隠しフィールドが、親カスタムコントロール内のポストバック時にビューステートからロードされない

nullで、ここでのコード私は単純にViewStateに頼って試してみました

protected override void CreateChildControls() 
    { 
     assignedListField = new HiddenField(); 
     assignedListField.ID = ClientID + "_HiddenAssignedList"; 
     assignedListField.EnableViewState = true; 

     Controls.Add(assignedListField); 
     base.CreateChildControls(); 
    } 

    public IList<DlpItem> GetAssignedItems() 
    { 
     //assignedListField = FindControl(ClientID + "_HiddenUnassignedList") as HiddenField; 
     var TmpAssignedItems = new List<DlpItem>(); 
     var list = assignedListField.Value; 
     var items = list.Split(new string[] { "#" }, StringSplitOptions.RemoveEmptyEntries); 
     foreach (var item in items) 
     { 
      var mix = item.Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries); 
      var text = mix[0]; 
      var id = int.Parse(mix[1]); 
      TmpAssignedItems.Add(new DlpItem(text, id)); 
     } 
     return TmpAssignedItems; 
    } 

です...その後も()にFindControlを使用しようとしました。いずれも動作しません、それはヌル参照として現れます...ここに何が起こっているかの入力?

答えて

3

@セバスチャンは、コントロールのいずれかを使用する必要がある場合、利用できないためnullになる可能性があることを示しています。ただし、EnsureChildControlsを呼び出してコントロールコレクションを作成し、コントロールコレクションを確保することができます。これにはViewStateの読み込みは含まれません。

ただし、クライアント側の操作がデータに影響を与える場合、ビューステートに依存することはできません。あなたがする必要があるのは、コントロールにIPostBackDataHandlerを実装させることです。 LostPostDataでは、隠し変数をチェックする必要があります。 postCollection [ClientID + "_HiddenAssignedList"]を使用すると、サーバーに送信された文字列値を取得し、結果を処理できます。

HTH。

+0

愚かな間違い。 EnsureChildControls()を呼び出すことを忘れた...私はすでに自分のコードでそれを持っていたと思った。まあそれは修正されました。ありがとう= D –

0

おそらく、CreateChildControls()がViewStateの読み込み時に呼び出されていない可能性があります(おそらく、あなたのケースではControlStateが便利です)。

実行ライフサイクルについては、http://msdn.microsoft.com/en-us/library/aa719775%28vs.71%29.aspxを参照してください。

あなたはCreateChildControls()が呼び出されるまで、」保存(および負荷)状態をLoadViewStateSaveViewState)-method(http://msdn.microsoft.com/de-de/library/system.web.ui.control.loadviewstate.aspx)を使用し、フィールドの値を格納することができます。