【问题标题】:Store data in array - then iterate that array将数据存储在数组中 - 然后迭代该数组
【发布时间】:2016-12-05 15:11:43
【问题描述】:

我有一个未修复的项目列表。它可以在 3 到 8 之间变化。我想要做的是循环找出我有多少项目 - 然后将这些项目存储在一个数组中,以便它们以相反的顺序排列并隐藏它们。然后我想回到那个数组并显示它们。

类似的东西。

For ix As Integer = Application.OpenForms.Count - 1 To 0 Step -1
    Dim frm = Application.OpenForms(ix)
    Dim arList() As String = {frm.Name}
    frm.Hide()
Next

所以就我而言,项目被保存在数组中,它不会给出任何错误,并且每次通过循环时,当我将鼠标悬停在 {frm.Name} 上时,它都会显示相应的项目

我怎样才能循环遍历这个数组,比如...

 for each ItemName as string in arList()
      if itemName <> "" then
         do something
      End if
 Next

【问题讨论】:

  • That arList 只能保存一个项目,因为您为循环中的每个项目重新声明了它。由于它是在块范围内声明的,因此它不会存在于 For 循环之外。您还应该知道 Application.OpenForms 会“忘记”表单
  • 我不懂VB,但你可能应该使用System.Collections.Generics 中的List&lt;string&gt;,然后执行myList.add(frm.name) 来添加项目。然后使用for each 循环遍历它。

标签: .net arrays vb.net


【解决方案1】:

代码存在一些基本问题:

For ix As Integer = Application.OpenForms.Count - 1 To 0 Step -1
    Dim frm = Application.OpenForms(ix)
    Dim arList() As String = {frm.Name}
    frm.Hide()
Next

Dim 使用 Scope 声明一个新变量,具体取决于它的声明位置。所以,

  1. 您的代码正在为每个表单声明一个新的arList,替换之前的表单。
  2. 它只能保存一个表单名称(遇到的最后一个)
  3. 因为它被声明为 inside For/Each 块,它只会存在于那里。这称为Block 范围:导致代码缩进的所有内容都会创建一个新的Block Scope

避免使用数组,除非它们要保存一些静态数据集(例如Dim foo As String() = {"red", "green", "blue"}。列表更易于使用、更灵活且更强大。

' form level list variable
Private myFormNames As List(Of String)

当你想在其他地方使用它时:

myFormNames = New List(Of String)

For n As Int32 = Application.OpenForms.Count - 1 To 0 Step -1
    Dim frm = Application.OpenForms(n)
    ' add this name to the list
    myFormNames.Add(frm.Name)
    frm.Hide()
Next

我不确定这有什么价值,因为 OpenForms 集合中应该仍然包含表单,因为您所做的只是隐藏它:

For n As Int32 = 0 To Application.OpenForms.Count - 1
    Dim frm = Application.OpenForms(n)
    If myFormNames.Contains(frm.Name) Then
        ' do something
    End If
Next

还请注意,OpenForms 集合已知会“忘记”表单。如果它是关键任务,您可能需要自己跟踪它们。

【讨论】:

  • 谢谢。我正在寻找以特定顺序排列它们。因此,如果我只是在第一个和第二个 FOR 循环中检查 .openforms - 我不知道所有表单是否都将按照相同的顺序。基本上,在第一个循环中,我的目标是以相反的顺序浏览打开的表格——所以我可以按特定的顺序保存它们。在第二个循环中 - 而不是通过打开的表单循环,我只想循环遍历数组并 .SHOW 按照它们保存的顺序(在数组内部)。如果我错了,请纠正我。
  • 我仍然看不到数组/列表的作用。由于您隐藏了所有显示的表单,您可以再次循环通过 openForms 集合并 .Show 他们 - 是什么让您认为顺序会改变?
  • 我不确定 - 我想确定。基本上整个事情的目标(正如你可能知道,因为你已经帮助了我的大部分东西)是隐藏所有表单,并在用户重新登录时再次显示它们。我只是想确保用户是否最后在 Form3 上 - 他们希望在重新登录时看到 Form3。Array 会确保他们处于该特定顺序?
  • 集合中的顺序是它们被创建/显示并添加到集合中的顺序,而不是 Z 顺序。
  • 在某些情况下,ActiveForm 可能就是您所需要的,但如果应用程序被最小化或不是来自应用程序(并且可能显示屏幕保护程序),它将是Nothing。您可能需要自己跟踪LastActiveForm
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-10
  • 2020-01-14
  • 2016-06-17
  • 2021-09-19
  • 1970-01-01
  • 2016-02-20
相关资源
最近更新 更多