ViewState在PostBack期间不保存值

时间:2013-05-15 17:58:57

标签: vb.net viewstate

我正在使用vb.net创建一个webapp,我需要在UpdatePanel中创建一个TextBox,以便在PostBack之后将焦点更改为另一个文本框。我决定使用一个ViewState来保存一个numbre,它将在加载时读取,以便知道焦点应该在哪里(有七个文本框应该像那样工作),但我不能只做一个工作。 这是最小的代码,不起作用。

     Dim g As Integer
    g = 1
    ViewState.Add("foco", g)

这是Page_Load。

 Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load


    If Page.IsPostBack Then
        If ViewState("foco") = 1 Then
            TextBox1.Focus()
        End If
    End If

End Sub

4 个答案:

答案 0 :(得分:0)

看起来你没有在回发之间递增计数器。

    If Page.IsPostBack Then
        If ViewState("foco") = 1 Then
            TextBox1.Focus()
        ElseIf ViewState("foco") = 2 Then
            TextBox2.Focus()
        ElseIf ViewState("foco") = 3 Then
            TextBox3.Focus()
        End If
        ViewState("foco") = ViewState("foco") + 1
    Else
        ViewState.Add("foco", 1)
    End If

答案 1 :(得分:0)

何时向ViewState添加值的代码是什么?

“不起作用”是什么意思?你期望发生什么,以及实际发生了什么?

在任何情况下,最简单的方法可能是向ViewState支持的Page添加一个属性,例如:

public int FocusIndex
{
    get 
    {
        object o = ViewState["foco"];
        return (o == null) ? -1 : (int) o;
    }
    set
    {
        ViewState["foco"] = value;
    }
}

答案 2 :(得分:0)

 Protected Sub TextBox7_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles TextBox7.TextChanged
    If TextBox7.Text = "" Then Exit Sub


    '  ListBox1.Visible = True


    ListBox1.Items.Clear()



    Dim con As New Data.OleDb.OleDbConnection("Provider=SQLOLEDB;Data Source=TEST08\AXSQLEXPRESS;Password=Axoft1988;User ID=sa;Initial Catalog=club_independiente")
    con.Open()

    'Dim com As New Data.OleDb.OleDbCommand("select * from emCaja where cod_client = '" & TextBox1.Text & "'", con)
    ' If "" & com.ExecuteScalar() = "" Then
    Dim com As New Data.OleDb.OleDbCommand

    com = New Data.OleDb.OleDbCommand("select * from emConceptos where codigo = " & TextBox7.Text, con)
    com.ExecuteNonQuery()

    Dim dr As Data.OleDb.OleDbDataReader
    dr = com.ExecuteReader

    While dr.Read
        ListBox1.Items.Add(dr("descripcion"))
        ListBox1.Items(ListBox1.Items.Count - 1).Value = dr("codigo")
    End While
    dr.Close()

    ' ListBox1.Focus()

    If ListBox1.Items.Count > 0 Then
        ListBox1.SelectedIndex = 0
    End If
    Dim g As Integer
    g = 1
    Session("foco") = g

End Sub

答案 3 :(得分:0)

您正在做的事情不起作用,因为page_load方法在TextChanged事件有机会执行之前运行。

试试这个:

  1. 在您的页面中添加一个scriptmanager;
  2. 将page_load逻辑放在page_preRender事件中,保证在textchanged事件之后触发;

    Protected Sub Page_PreRender(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.PreRender
    
        If Page.IsPostBack Then
            If ViewState("foco") = 1 Then
                ScriptManager1.SetFocus(TextBox1)
            End If
        End If
    
    End Sub