2010-02-23 42 views
0

我正在構建一個組合服務器控件,該控件當前只有一個TextBox和一個DropDownList。這是在其所有的胎兒榮耀代碼:複合控件中的DropDownList在回發中丟失選定的值

public Address : CompositeControl 
{ 
    private string[] _states = new string[] 
    { 
     string.Empty, "ACT", "NSW", "VIC", "QLD", "SA", "WA", "NT", "TAS" 
    }; 
    private TextBox _street; 
    private DropDownList _state; 

    public string Street 
    { 
     get { return _street.Text; } 
     set { _street.Text = value; } 
    } 
    public string State 
    { 
     get { return _state.Text; } 
     set { _state.Text = value; } 
    } 

    public Address() : base() 
    { 
     EnsureChildControls(); 
    } 

    protected override void CreateChildControls() 
    { 
     _street = new TextBox(); 
     _state = new DropDownList(); 

     _state.Items.AddRange(
      Array.ConvertAll<string, ListItem>(_states, ListItem.FromString)); 

     Controls.Add(_street); 
     Controls.Add(_state); 
    } 
} 

控制似乎是在回傳正常工作,也就是直到聲明值設置,如:

<squee:Address runat="server" ID="a" Street="123 Fake St" State="VIC" /> 

在此之後,文本框繼續以正確工作,但_state成員不拾取發佈的後值,而是堅持聲明的值。我已經檢查了Request對象中的原始發佈值,並且列表的UniqueID的新值在那裏,但_state不會提取它。

我很確定這將會是明顯的,但我只是在這裏旋轉我的輪子。

+0

它爲我工作。 – 2010-02-23 05:43:23

回答

1

發生這種情況是因爲您要在每次頁面加載時添加ListItems。不要在PostBack上重新創建列表項,ViewState將會恢復它們。

+0

我不認爲就是這樣(儘管稍後有機會時我會再仔細檢查一下),因爲我可以在普通ASPX頁面(不是控件的一部分)上創建DropDownList,並重新初始化其Items集合並在每頁加載時在Page.OnInit中設置一個默認值,在這種情況下,它會正確恢復OnInit和OnLoad之間的發佈值。 – 2010-02-23 03:52:42

+1

我猜想這可能是查看狀態,說實話。如果你仍然爲此而苦苦掙扎,而Bryan的解決方案無濟於事,那麼我剛剛發佈到另一個問題的答案可能會有所幫助:http://stackoverflow.com/questions/3854193/3865762#3865762 – 2010-10-05 16:38:28

+0

歐文 - 我只是注意到你的現在發表評論,並且鏈接的答案確實是正確的。如果你在這個問題上發佈了1/4,我可以將其標記爲已回答。 – 2011-01-13 12:02:14