繁体   English   中英

我想在回发时保留一个数组

[英]I want to preserve an array on postback

我有一个页面,有人要输入一个字符串。 将有一个提交按钮,但我们还希望此页面与扫描仪一起使用,以便在扫描时回发。 那部分我稍后会担心。

我现在想要的是能够在文本框中输入一个字符串,点击提交,然后将该字符串保存到一个数组中。 然后文本框被清除,他们可以输入另一个字符串。 它会将这个字符串保存到数组中并重复。 在用户拥有他们想要的所有字符串后,将有另一个按钮来执行其他操作(不重要)。 所以它会抓取数组中的所有字符串并执行一些代码。

现在我似乎无法让数组来保存信息。 我人生中第一次尝试使用 ViewState,当我从回发回来时看到了该字符串,但我无法将该字符串保存到数组中。

我希望这是有道理的

Protected jobs() As String
Protected i As Integer = 0

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

If Not ViewState("jobs") Is Nothing Then
    jobs(i) = ViewState("jobs").ToString
    i += 1
End If

Protected Sub btnAddToBatch_Click(sender As Object, e As EventArgs) Handles btnAddToBatch.Click
    If txtJob.Text <> "" Then
        ViewState("jobs") = txtJob.Text
    End If
End Sub

我已经弄清楚了,以防有人感兴趣。

Protected jobs(0) As String
Protected i As Integer = 0 

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

If Not ViewState("jobs") Is Nothing Then
    jobs = ViewState("jobs")
    i = ViewState("i")
End If

End Sub

Protected Sub btnAddToBatch_Click(sender As Object, e As EventArgs) Handles btnAddToBatch.Click

If txtJob.Text <> "" Then
    If i = 0 Then
        ReDim jobs(0)
    Else
        ReDim Preserve jobs(jobs.Length)
    End If
    jobs(i) = txtJob.Text
    i = i + 1
    ViewState("i") = i
    ViewState("jobs") = jobs
End If

End Sub

我会这样设置列表:

Public MyList As New List(Of String)

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

    If IsPostBack = False Then
       ' first time page load - put MyList into session()
        Session("Mylist") = MyList
    Else
        ' page post back - pull list from session
        MyList = Session("MyList")
    End If

End Sub

Protected Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

    ' add a value to a text box on say simple button click

    Debug.Print(TextBox1.Text)

    MyList.Add(TextBox1.Text)


End Sub

Protected Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click

    Debug.Print("number in list = " & MyList.Count)

    Debug.Print("First value in list = " & MyList.Item(0))

    ' display all items in list

    For Each s As String In MyList
        Debug.Print(s)
    Next

End Sub

请注意,我们甚至不必将 MyList 推回 session()。 它像任何 object 一样是指向 session 中的 Mylist 的指针。 以上内容也适用于视图状态。

如您所见,通过使用列表代替数组,我们不必重新变暗,我们不必有额外的“i”值,并且列表可以随着我们放置而扩展。 此外,该列表还有其他很酷的功能,例如

    MyList.Contains        - search  the list for a match
    MyList.Sort()          - sort the list

因此,不仅列表是动态的,不需要重新变暗,而且您还可以搜索和搜索列表,而无需编写循环代码。 即使在 VBA 中,我现在也倾向于使用集合或列表 - 它们的代码少得多,更容易使用,并且如前所述,您可以获得额外的功能,例如使用“包含”搜索,甚至排序能力。 即使拥有所有这些功能,您最终编写的代码也会更少,并且在少数情况下必须处理基于 integer 值的循环以从数组中获取值。

Array 的 go 可以追溯到过去的 FORTRAN 或较旧的 PC“基本”语言,现在有了列表或 collections,我们不仅有更少的工作量和更好的选择,而且更灵活。

这并不是什么大不了的事——但正如你所看到的,通过使用给定 web 页面的加载事件,我们只需在一个位置且仅在一个位置设置值——因为它是 object,然后进一步的代码可以简单地添加/更改或对 MyList 执行任何操作,并且我们不需要将 MyList 推回 session - 因为加载事件会处理此过程。 从 session() 设置 MyList 意味着 MyList “指向” session 中的 object - 这就是为什么我什至不必将列表保存回 Z21D6F40CFB511982E4424E0ELY2509 的原因,而是在加载时加载。 任何和所有其他事件(例如按钮代码等)现在都可以自由添加到该列表或执行任何操作 - 并且不需要通过上述设置将 MyList 发送/保存回 session。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM