1

我无法为应该跨多个页面工作的 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

我检查了最后一个值的断点,它肯定正确传递了 - 为加载参数传递的值是“2”,这是正确的,但 SelectedIndexChanged 会话值似乎默认回到 1。总是。任何指针?

4

3 回答 3

1

控制事件处理程序在事件发生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事件处理程序将完成这项工作

于 2013-04-12T19:42:27.107 回答
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 中的项目是静态的(在标记中定义)

于 2013-04-12T19:41:29.337 回答
0

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

ddlOffice.SelectedValue = (string)(Session("Office"))
于 2013-04-12T19:44:01.667 回答