如何在(asp.net)自定义服务器控件中维护状态?

我试图做一个自定义的服务器控件从DropDownList继承。 我给控件一个包含一些键/值对的XML输入,我的控件将它们显示为DropDownList。 我在覆盖Render方法中做这样的列表项:

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(){}

保护覆盖无效渲染(HtmlTextWriter作家){writer.RenderBeginTag(HtmlTextWriterTag.Table); writer.RenderBeginTag(HtmlTextWriterTag.Tr);

writer.RenderBeginTag(HtmlTextWriterTag.Td); #地区解析竞争如果(!String.IsNullOrEmpty(this.Contents)){XElement根= 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(项目);

(XElement child in root.Elements(“Choice”)){string title = child.Element(“Title”)。 string score = child.Element(“Score”)。Value; item = new ListItem(); item.Text = title; item.Value =分数;

this.Items.Add(item);

}} #endregion base.Render(writer); 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(); }#区域属性public string Contents {get {return ViewState [“Contents”] == null? “”:ViewState [“Contents”]。ToString(); } set {ViewState [“Contents”] = value; }}

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

私人字符串mValidationGroup; public string ValidationGroup {get {return mValidationGroup; } set {mValidationGroup = value; }}

公共字符串SelectedChoice {get {return“”; }}

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

#endregion}

提前致谢。


你有两个选择:ViewState或ControlState。

与ViewState不同的是,可以通过在页面指令中设置EnableViewState="false"来覆盖ViewState,而ControlState则不能。

基本上你需要在获取/设置下拉列表的值时勾住状态包

这里有一个很好的例子,其中一个自定义控件是从Button类派生的,并且在页面请求之间保持状态 - 应该很好地适合您的场景。

希望能让你开始。

链接地址: http://www.djcxy.com/p/56659.html

上一篇: How to maintain state in (asp.net) custom server control?

下一篇: XML webservice dataset