2011-12-28 14 views
1

私はTestPanelとHeaderの2つのカスタムコントロールを持っています。どちらもパネルです。 TestPanelにもヘッダーが含まれています。 TestPanelとHeaderにはTestという文字列プロパティが1つしか含まれていません。aspnet customcontrol in customcontrol losts viewstate

フォームにヘッダーのみを置くことができます。それはうまくいく。 フォームにTestPanelを置くことができ、TestPanel + Headerが表示されます。ヘッダーのViewStateが失われている(またはHeader.Testがその値を失う別の理由がある)ため、期待どおりに動作しません。私が使用して自分のページで

public class TestPanel : System.Web.UI.WebControls.Panel 
{ 
    Header myHeader; 

    public string Test //Test is Header property; set/get header Test property 
    { 
     get 
     { 
      return this.MyHeader.Test; 
     } 
     set 
     {    
      this.MyHeader.Test = value; 
     } 
    } 

    public Header MyHeader 
    { 
     get 
     {     
      return myHeader; 
     } 
     set 
     {    
      myHeader = value; 
     } 
    }  

    public TestPanel() 
    { 

    } 
    protected override void Render(HtmlTextWriter writer) 
    { 
     writer.Write(Test); 
     MyHeader.RenderControl(writer); 
    } 
} 

public class Header : System.Web.UI.WebControls.Panel 
{ 
    public string Test 
    { 
     get 
     { 
      string s = (string)ViewState[ID + "Test"]; 
      return (s == null) ? String.Empty : s; 
     } 
     set 
     { 
      ViewState[ID + "Test"] = value; 
     } 
    } 


    public Header() 
    { 
    } 

    protected override void Render(HtmlTextWriter writer) 
    { 
     writer.Write(Test); 
    } 

} 

: はここに私のコードです

1)のみテストパネルの私のフォームに(これは)ポストバック後に動作しない場合:

protected void Page_Load(object sender, EventArgs e) 
    { 
     if (!Page.IsPostBack) 
     {   
      this.panel.Test = "paneltest"; 
     } 

    } 

protected void Unnamed2_Click(object sender, EventArgs e) 
    { 

    } 

2)私のページのヘッダーのみの場合(ポストバック後に動作します)

<my:MyHeader id="header" runat="server"></my:MyHeader > 
this.header.Test = "headertest" 

答えて

0

ビューステートが永続化されている場合、SaveViewState()はコントロール階層内の各コントロールに対して再帰的に呼び出されます。提供されたコードでは、HeaderはTestPanelのControlsコレクションに追加されていないため、コントロール階層にはないので、HeaderのTestプロパティの値は失われます。

ビューステートの保存方法とロード方法の詳細については、Understanding ASP.NET View Stateを参照してください。

関連する問題