2010-08-10 60 views
1

我想做一個從DropDownList繼承的自定義服務器控件。我給控件一個包含一些鍵/值對的XML輸入,我的控件將它們顯示爲DropDownList。 我做在覆蓋列表中的項目Render方法是這樣的:如何在(asp.net)自定義服務器控件中維護狀態?

foreach (XElement child in root.Elements("Choice")) 
{ 
    string title = child.Element("Title").Value; 
    string score = child.Element("Score").Value; 
    item = new ListItem(); 
    item.Text = title; 
    item.Value = score; 

    this.Items.Add(item); 
} 

的問題是,當在列表中的用戶選擇和項目,並在頁面回發,所選擇的項目被丟失,列表使用默認數據重新初始化。

有沒有人有任何想法如何保持選定的項目,即保持狀態?

下面是完整的源:

public class MultipleChoiceQuestionView2 : DropDownList 

{ 公共MultipleChoiceQuestionView2() :鹼() { }

保護覆蓋無效渲染(HtmlTextWriter的作家) { writer.RenderBeginTag (HtmlTextWriterTag.Table); writer.RenderBeginTag(HtmlTextWriterTag.Tr);

writer.RenderBeginTag(HtmlTextWriterTag.Td);如果(!String.IsNullOrEmpty(this.Contents)) { XElement root = XElement.Parse(this.Contents);

if(root.HasAttributes) this.NoOfChoices = Int32.Parse(root.Attribute(「ItemCount」)。Value); }

this.Items.Clear(); this.Style.Add(「width」,「100px」); this.Style.Add(「font-family」,「Tahoma」); this.Items.Clear(); ListItem item = new ListItem(); item.Text =「」; item.Value =「0」; this.Items.Add(item);

的foreach(的XElement兒童root.Elements( 「選擇」)) { 串標題= child.Element( 「標題」)值。 string score = child.Element(「Score」)。Value; item = new ListItem(); item.Text = title; item.Value =分數;

this.Items.Add(item); 

} } #endregion base.Render(作家); writer.RenderEndTag();

if(this.Required) { RequiredFieldValidator rfv = new RequiredFieldValidator(); rfv.ControlToValidate = this.ID; rfv.InitialValue =「0」; rfv.Text =「*」; (!String.IsNullOrEmpty(this.ValidationGroup)) rfv.ValidationGroup = this.ValidationGroup; } writer.RenderBeginTag(HtmlTextWriterTag.Td); rfv.RenderControl(writer); 作家。RenderEndTag(); }

writer.RenderEndTag(); writer.RenderEndTag(); } #地區屬性 public string目錄 { 得到 { return ViewState [「Contents」] == null? 「」:ViewState [「Contents」]。ToString(); } set { ViewState [「Contents」] = value; } }

private int mNoOfChoices; public int NoOfChoices { get {return mNoOfChoices; } set {mNoOfChoices = value; } }

private string mValidationGroup; public string ValidationGroup { get {return mValidationGroup; } set {mValidationGroup = value; }}

公共字符串SelectedChoice { 得到 { 回報 「」; } }

private bool mRequired = false; public bool必需 { get {return mRequired; } set {mRequired = value; }}

#endregion }

在此先感謝。

+0

這裏是一個很好的回答,您可以檢查[ASP.NET控件項目集合不IList的科技工作] [1] [1]:http://stackoverflow.com/questions/31947655/ASP淨控制項目信息收集犯規工作與 - ilistt – 2015-08-14 09:36:12

回答

2

您有兩種選擇:ViewStateControlState

作爲ViewState的區別可以通過在頁面指令中設置EnableViewState="false"來覆蓋,而ControlState不能。

實質上,當您獲取/設置下拉列表的值時,您需要掛鉤狀態包

有一個體面的例子here其中一個自定義控件派生自Button類並維持頁面請求之間的狀態 - 應該很好地適合您的場景。

希望能讓你開始。

相關問題