使用ViewState通过回发来维护属性状态

时间:2014-10-28 01:56:30

标签: c# asp.net viewstate asp.net-webpages

我知道这是一个常见的问题,我已经环顾四周并尝试了很多东西,但我似乎无法让它正常工作。

我有一个下拉列表,按升序列出其元素,我添加了一个复选框,可以反转下拉列表的顺序。

我正在尝试向下拉列表控件添加一个属性,类似于:

    public bool isReverse = false;

    public bool reverse
    {
        get
        {
            return ViewState["isReverse"] != null ? (bool)ViewState["isReverse"] : false;
            //return ViewState["isReverse"] != null ? (bool)ViewState["isReverse"] : isReverse;
//I have also tried returning isReverse, but its the same behaviour
        }
        set
        {
            ViewState["isReverse"] = value;
            isReverse = value;
        }

    } 

那里可能有多余的代码。我的复选框有一个事件处理程序,它执行以下操作:

    protected void isReverse_CheckedChanged(object sender, EventArgs e)
    {
        CheckBox myBox = (CheckBox)sender;
        SortableCustomDropDownLIst myList = sddl;
        if (myBox.Checked)
        {
            myList.reverse = true;
        }
        else
        {
            myList.reverse = false;
        }
    }

我的初始解决方案是没有使用ViewState,因此每次我们进行回发时它都会重置为false,并且它永远不会以相反的顺序列出。我的代码检查此属性并确定是否需要反转负责提供下拉列表的ArrayList。

我不确定为什么我的程序有以下行为:

加载页面:升序,CheckBox取消选中

选中复选框:仍然升序,检查复选框

取消选中复选框:降序,CheckBox未选中

选中复选框:升序,CheckBox已选中

...重复。

这些集只由复选框的事件处理程序调用,只在排序下拉列表时调用get。我误解了什么,我不明白为什么这样做不会起作用,除非我误解了ViewState如何正常工作。

我认为它与第一个事件句柄如何触发属性为true有关,但ViewState尚未设置,因此它不会记住任何内容。

1 个答案:

答案 0 :(得分:0)

我发现了我做错了什么。

我试图在Page_Load中使用/重做我的下拉列表,但是我应该切换true / false的属性尚未修改,因为在单击复选框的情况下这样做了。

我将执行排序/显示下拉列表顺序的功能移动到复选框事件,现在它按预期工作。