【问题标题】:VB.Net ArrayListVB.Net 数组列表
【发布时间】:2018-09-21 23:12:34
【问题描述】:

我正试图围绕 vb.net 中的数组列表展开思考。我通过互联网自学,但似乎无法全部弄清楚。有些点我无法将这些点连接到:

  1. 如何使数组列表通用,这样它就不会卡在子程序中,并且我可以允许任何子程序访问列表。

  2. 允许将列表添加到表单上的另一个控件或从中删除。

  3. 保存此数组列表,以便程序在启动时使用它填充列表框。

  4. 这是视觉基本概念的图像:

    https://imgur.com/lBbopD8

【问题讨论】:

  • 你应该使用List(Of T)
  • ArrayList 类的存在是为了提供动态数组功能。它的行为很像一个数组,但它不是固定大小,而是可以动态增长和收缩。它的问题是每个项目都是Object 引用,这意味着任何对象都可以作为项目添加,并且当您取回每个项目时,您必须将其转换为其实际类型。自 .NET 2.0 和 VB 2005 以来,ArrayList 基本上已经过时,随着泛型和 List(Of T) 的出现。它像ArrayList 一样工作,只是它提供类型安全,因此您不能添加错误类型的对象并且不需要强制转换
  • 问题 1 是一个简单的范围问题。对变量范围做一些阅读。问题 2 毫无意义,因为表单中的所有代码都是表单的一部分。您没有在任何控件中添加任何代码,因此不会从任何控件将任何内容添加到任何列表中。例如,如果您处理 ButtonClick 事件,则该事件处理程序是您的表单的一部分,而不是 Button 的一部分。

标签: arrays vb.net arraylist


【解决方案1】:

直到问题 3,使用List(Of T) 是要走的路。它可能仍然存在,但肯定不完全,甚至可能根本不存在。在List(Of T) 出现之前,Microsoft 认识到将Strings 存储在集合中是最常见的要求,因此,为了在这种情况下提供类型安全,他们提供了StringCollection 类。你说你想在会话之间保留你的值列表,这可能意味着使用My.Settings,实际上可以创建StringCollection类型的设置。

我建议您打开项目属性的设置页面并添加StringCollection 类型的设置。添加后,该列表将在启动时自动加载并在关闭时保存,无需您提供任何代码。您可以通过My.Settings 在应用程序中的任何位置访问它,也可以调用AddRemove 或对其进行索引或循环,其方式与ArrayListList(Of String) 完全相同。

不过,设置中有一个带有StringCollection 的小问题。默认情况下它实际上是Nothing。避免这种情况的诀窍是在“设置”页面上编辑其Value 以添加一个项目,提交该项目,然后再次对其进行编辑以删除该项目。您会看到,Value 字段不是空的,而是包含 XML 的 sn-p。这就是在设置文件中创建StringCollection 对象。

正如我所说,如果您想在会话之间保留此列表,那么我强烈建议您以这种方式使用设置。请注意,为了编辑设置,它们必须是用户范围的,而不是应用程序范围的。这意味着每个单独的 Windows 用户都将拥有自己的设置副本,从而拥有自己的价值。如果您仅使用一个帐户登录 Windows,则没有任何影响。如果多个 Windows 用户使用该应用程序,那么在大多数情况下它可能被认为是有益的,但如果您想要可以编辑的通用设置,则可能会出现问题。如果这是一个问题,您将需要自己处理持久性,但请注意标准 Windows 用户(而不是管理员)将无权在任何地方写入数据,这正是用户范围设置以它们的方式工作的原因.

此外,虽然您必须使用 StringCollection 来保持设置的持久性,但您可能希望也可能不希望在其余代码中使用相同的集合。您可以一直直接访问该集合,或者您可以选择在启动时将集合复制到List(Of String),然后在关闭时将数据复制回来。除非您想避免在关闭之前提交项目,否则我不会为额外的收集而烦恼。

【讨论】:

    【解决方案2】:

    所以要知道的重要一点是,您可以直接填充和编辑列表框,而无需额外的 ArrayList。您将使用以下示例代码:

       'addTb is the text box you had in the image; this will run on button press event
    
        ListBox1.Items.Add(addTB.Text)
    

    如果您希望将 ArrayList 数据转储到列表框中,请使用以下内容:

       'creates new arraylist and adds items to it
        Dim listStuff As ArrayList = New ArrayList
        listStuff.Add("Hi")
        listStuff.Add(2)
    
        'makes listStuff the datasource for your list box
        ListBox1.DataSource = listStuff
    

    最后,如果您想循环遍历 ArrayList 项目,请使用以下内容:

       'remember to do count - 1 or you will receive error since index will be out of range
        For i = 0 To listStuff.Count - 1
            If listStuff.Item(i) = "" Then
                'do stuff here
            End If
        Next
    

    希望这会有所帮助。让我知道是否需要更清楚,因为这是我的第一个堆栈溢出答案:)

    【讨论】:

      【解决方案3】:

      您正在使用 ListBox 控件来可视化来自 TextBox 控件的可能是 String 值的集合。 ListBox 通过Items 属性公开可视化集合。

      如何使数组列表通用,这样它就不会卡在子例程中,并且我可以允许任何子程序访问列表。

      由于 ListBox 控件位于 Form 上,您可以通过 Form 代码中的任何访问级别访问 Items 属性。

      允许将列表添加到表单上的另一个控件或从中删除。

      在 Items 属性中,您可以使用 Add 方法添加单个值,使用 AddRange 方法通过数组或另一个 ListBox 集合添加多个值,使用 Insert 方法在给定索引,Remove 方法用于特定项目,RemoveAt 方法用于删除给定索引处的项目。

      因此,在您的情况下,由于您可能将 TextBox 的 Text 属性中的值添加到 ListBox,因此很简单:

      ListBox1.Items.Add(TextBox1.Text)
      

      保存此数组列表,以便程序使用 它在启动时。

      您有几个选项,但通常的想法是在应用程序关闭时将 Items 属性中的每个值写入给定文件的相应行,然后通过从同一文件中读取每一行来加载每个值。另一种选择是使用 My.Settings,尽管我认为以您的专业水平,最好坚持读/写文件选项,这样您就不必担心与此选项相关的一些陷阱。这是一个将项目读/写到文件的快速示例:

      'Write the items to the file
      Dim items(ListBox1.Items.Count - 1) As String
      ListBox1.Items.CopyTo(items, 0)
      IO.File.WriteAllLines("file.txt", items)
      
      'Read the items to the file
      ListBox1.Items.AddRange(IO.File.ReadAllLines("file.txt"))
      

      【讨论】:

      • 这是很棒的信息!不知何故,我错过了你提到的关于直接添加到列表框的第一部分。如何从辅助表单添加到列表框。如,您点击一个按钮打开 form2 并将您的文本放在那里。一旦你点击了一个按钮,它就会将它添加到控件中(这个例子是列表框)。这就是为什么我问要让它普遍可用。如果这有意义的话。
      • 您需要先限定控件,这仅仅意味着您需要指定控件所在的位置。因此,例如,如果您的 ListBox 位于名为 Form1 的表单上,然后您打开 Form2 以输入文本,则在 Form2 上的按钮单击事件中,您将调用:Form1.ListBox1.Items.Add(TextBox1.Text) 假设 TextBox1 在 Form2 上。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-23
      • 2021-01-21
      • 2011-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多