下拉列表不将数据保存到会话

时间:2013-04-12 19:38:02

标签: asp.net vb.net

我无法保存应该在多个页面上工作的DropDownList的会话。这是我现在的代码:

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        ddlOffice.SelectedValue = Session("Office")
End Sub

这是我分配值的代码......

Protected Sub ddlOffice_SelectedIndexChanged(ByVal sender As Object, ByVal e As EventArgs) Handles ddlOffice.SelectedIndexChanged
    Session("Office") = ddlOffice.SelectedItem.Value.ToString
End Sub

我使用断点检查了最后一个值并且它肯定正确传递 - 为load参数传递的值是“2”,这是正确的,但SelectedIndexChanged会话值似乎默认返回1.始终。有什么指针吗?

3 个答案:

答案 0 :(得分:1)

控制事件处理程序在<{strong> Page_Load事件之后被触发。 ddlOffice_SelectedIndexChanged事件处理程序也是如此。代码ddlOffice.SelectedValue = Session("Office")已在Page_Load阶段运行,然后会话具有旧值。要解决此问题,请按以下方式更改ddlOffice_SelectedIndexChanged

Protected Sub ddlOffice_SelectedIndexChanged(
         ByVal sender As Object, 
         ByVal e As EventArgs) Handles ddlOffice.SelectedIndexChanged
     Session("Office") = ddlOffice.SelectedItem.Value.ToString
     ddlOffice.SelectedValue = ddlOffice.SelectedItem.Value.ToString
End Sub

并在Page_Load事件中添加一个检查:

If Not Page.IsPostback
    ddlOffice.SelectedValue = Session("Office")

后者不是强制性的,但在回发中你不需要这个,因为SelectedIndexChanged事件处理程序将完成这项工作

答案 1 :(得分:0)

你似乎确信SelectedIndexChange事件是问题,但我想我会提到这个:

如果您将此行放在Page_Load的最顶部,如您所示:

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        ddlOffice.SelectedValue = Session("Office")
End Sub

由于下拉列表中应填充的数据尚未绑定,因此无法找到任何内容。您需要在用于将数据绑定到下拉列表的任何代码之后设置所选值,除非DDL中的项是静态的(在标记中定义)

答案 2 :(得分:0)

将所选值的分配移动到下拉列表的DataBound事件中,并将会话变量强制转换为字符串,如下所示:

ddlOffice.SelectedValue = (string)(Session("Office"))