我正在尝试创建一个继承自DropDownList的自定义服务器控件。我给控件一个包含一些键/值对的XML输入,我的控件将它们显示为DropDownList。 我在覆盖渲染方法中创建列表项,如下所示:
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
{ public MultipleChoiceQuestionView2() :base() { }
protected override void Render(HtmlTextWriter writer) { writer.RenderBeginTag(HtmlTextWriterTag.Table); writer.RenderBeginTag(HtmlTextWriterTag.Tr);
writer.RenderBeginTag(HtmlTextWriterTag.Td); #region Parse Contets if(!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(项目);
foreach(root.Elements中的XElement子元素(“Choice”)) { string title = child.Element(“Title”)。Value; string score = child.Element(“Score”)。值; 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 =“*”; if(!String.IsNullOrEmpty(this.ValidationGroup)) { rfv.ValidationGroup = this.ValidationGroup; } writer.RenderBeginTag(HtmlTextWriterTag.Td); rfv.RenderControl(作家); writer.RenderEndTag(); }
writer.RenderEndTag(); writer.RenderEndTag(); } #region属性 公共字符串内容 { 得到 { return ViewState [“Contents”] == null? “”:ViewState [“Contents”]。ToString(); } 组 { ViewState [“Contents”] = value; } }
private int mNoOfChoices; public int NoOfChoices { 得到{return mNoOfChoices; } 设置{mNoOfChoices = value; } }
private string mValidationGroup; 公共字符串ValidationGroup { get {return mValidationGroup; } 设置{mValidationGroup = value; } }
public string SelectedChoice { 得到 { 返回“”; } }
private bool mRequired = false; public bool必填 { 得到{return mRequired; } set {mRequired = value; } }
#endregion }
提前致谢。
答案 0 :(得分:2)
您有两种选择:ViewState或ControlState。
可以通过在页面指令中设置EnableViewState="false"
来覆盖ViewState的区别,而ControlState则不能。
当您获取/设置下拉列表的值时,基本上您需要挂钩状态包。
有一个不错的示例here,其中自定义控件派生自Button类并维护页面请求之间的状态 - 应该很好地适合您的场景。
希望这能让你开始。