原文: http://zetcode.com/gui/vbwinforms/advanced/

在 Visual Basic Winforms 教程的这一部分中,我们介绍一些更高级的控件。 即ListBoxListViewTreeView控件。

ListBox

ListBox控件用于显示项目列表。 用户可以通过单击选择一个或多个项目。

  1. ' ZetCode Mono Visual Basic Winforms tutorial
  2. '
  3. ' This program shows how to use
  4. ' the ListBox control. Item selected from
  5. ' the ListBox is shown in the statusbar.
  6. '
  7. ' author jan bodnar
  8. ' last modified May 2009
  9. ' website www.zetcode.com
  10. Imports System.Windows.Forms
  11. Imports System.Drawing
  12. Public Class WinVBApp
  13. Inherits Form
  14. Private sb As StatusBar
  15. Public Sub New
  16. Me.Text = "ListBox"
  17. Me.Size = New Size(210, 210)
  18. Me.InitUI
  19. Me.CenterToScreen
  20. End Sub
  21. Private Sub InitUI
  22. Dim lb As New ListBox
  23. lb.Parent = Me
  24. lb.Items.Add("Jessica")
  25. lb.Items.Add("Rachel")
  26. lb.Items.Add("Angelina")
  27. lb.Items.Add("Amy")
  28. lb.Items.Add("Jennifer")
  29. lb.Items.Add("Scarlett")
  30. lb.Dock = DockStyle.Fill
  31. sb = New StatusBar
  32. sb.Parent = Me
  33. AddHandler lb.SelectedIndexChanged, AddressOf Me.OnChanged
  34. End Sub
  35. Private Sub OnChanged(ByVal sender As Object, ByVal e As EventArgs)
  36. sb.Text = sender.SelectedItem
  37. End Sub
  38. Public Shared Sub Main
  39. Application.Run(New WinVBApp)
  40. End Sub
  41. End Class

我们的示例显示了一个具有六个名称的列表框。 所选项目显示在状态栏中。

  1. Dim lb As New ListBox
  2. lb.Parent = Me

ListBox控件已创建。

  1. lb.Items.Add("Jessica")

这就是我们向ListBox控件添加新项目的方式。 该控件具有Items属性。 该属性是对列表框中项目列表的引用。 使用此引用,我们可以添加,删除或获取列表框中的项目数。

  1. AddHandler lb.SelectedIndexChanged, AddressOf Me.OnChanged

当我们选择一个项目时,会触发SelectedIndexChanged事件。

  1. sb.Text = sender.SelectedItem

OnChanged方法内部,我们将所选文本设置为状态栏。

进阶控件 - 图1

图:ListBox

ListView

ListView控件用于显示项目集合。 它是比ListBox控件更复杂的控件。 它可以在各种视图中显示数据,主要用于在多列视图中显示数据。

  1. ' ZetCode Mono Visual Basic Winforms tutorial
  2. '
  3. ' This program shows how to use
  4. ' the ListView control. Item selected from
  5. ' the ListView is shown in the statusbar.
  6. '
  7. ' author jan bodnar
  8. ' last modified May 2009
  9. ' website www.zetcode.com
  10. Imports System.Windows.Forms
  11. Imports System.Drawing
  12. Imports System.Collections.Generic
  13. Public Class Actress
  14. Public Dim m_name As String
  15. Public Dim m_year As Integer
  16. Public Sub New(ByVal name As String, ByVal year As Integer)
  17. Me.m_name = name
  18. Me.m_year = year
  19. End Sub
  20. End Class
  21. Public Class WinVBApp
  22. Inherits Form
  23. Private Dim sb As StatusBar
  24. Private Dim lv As ListView
  25. Public Sub New
  26. Me.Text = "ListView"
  27. Me.Size = New Size(350, 300)
  28. Me.InitUI
  29. Me.CenterToScreen
  30. End Sub
  31. Private Sub InitUI
  32. Dim actresses As New List(Of Actress)
  33. actresses.Add(New Actress("Jessica Alba", 1981))
  34. actresses.Add(New Actress("Angelina Jolie", 1975))
  35. actresses.Add(New Actress("Natalie Portman", 1981))
  36. actresses.Add(New Actress("Rachel Weiss", 1971))
  37. actresses.Add(New Actress("Scarlett Johansson", 1984))
  38. Dim name As New ColumnHeader
  39. name.Text = "Name"
  40. name.Width = -1
  41. Dim year As New ColumnHeader
  42. year.Text = "Year"
  43. Me.SuspendLayout
  44. lv = New ListView
  45. lv.Parent = Me
  46. lv.FullRowSelect = True
  47. lv.GridLines = True
  48. lv.AllowColumnReorder = True
  49. lv.Sorting = SortOrder.Ascending
  50. lv.Columns.AddRange(New ColumnHeader() {name, year})
  51. For Each act As Actress In actresses
  52. Dim item As New ListViewItem
  53. item.Text = act.m_name
  54. item.SubItems.Add(act.m_year.ToString())
  55. lv.Items.Add(item)
  56. Next
  57. lv.Dock = DockStyle.Fill
  58. sb = New StatusBar
  59. sb.Parent = Me
  60. lv.View = View.Details
  61. Me.ResumeLayout
  62. AddHandler lv.Click, AddressOf Me.OnChanged
  63. AddHandler lv.ColumnClick, AddressOf Me.OnColumnClick
  64. End Sub
  65. Private Sub OnChanged(ByVal sender As Object, ByVal e As EventArgs)
  66. Dim name As String = lv.SelectedItems(0).SubItems(0).Text
  67. Dim born As String = lv.SelectedItems(0).SubItems(1).Text
  68. sb.Text = name & ", " & born
  69. End Sub
  70. Private Sub OnColumnClick(ByVal sender As Object, _
  71. ByVal e As ColumnClickEventArgs)
  72. If sender.Sorting = SortOrder.Ascending
  73. sender.Sorting = SortOrder.Descending
  74. Else
  75. sender.Sorting = SortOrder.Ascending
  76. End If
  77. End Sub
  78. Public Shared Sub Main
  79. Application.Run(New WinVBApp)
  80. End Sub
  81. End Class

在我们的示例中,我们有一个包含两列的列表视图。 在第一列中,我们显示女演员的名字。 在第二个他们的出生日期。 数据存储在List集合中。 通过选择一行,一行中的数据将显示在状态栏中。 另外,通过单击列标题,可以对数据进行排序。

  1. Public Class Actress
  2. ...
  3. End Class

我们使用Actress类存储数据。

  1. Dim actresses As New List(Of Actress)
  2. actresses.Add(New Actress("Jessica Alba", 1981))
  3. actresses.Add(New Actress("Angelina Jolie", 1975))
  4. ...

我们创建项目并在项目中填充项目。

  1. Dim name As New ColumnHeader
  2. name.Text = "Name"
  3. name.Width = -1

对于列表视图中的每一列,我们创建一个ColumnHeader。 通过将Width设置为 -1,列的宽度等于列中最长的项目。

  1. lv = New ListView
  2. lv.Parent = Me

创建一个ListView控件。

  1. lv.FullRowSelect = True
  2. lv.GridLines = True
  3. lv.AllowColumnReorder = True
  4. lv.Sorting = SortOrder.Ascending

在这里,我们设置控件的四个属性。 该代码行支持全行选择,显示网格线,通过拖动列对列进行重新排序并以升序对数据进行排序。

  1. lv.Columns.AddRange(New ColumnHeader() {name, year})

在这里,我们将两个ColumnHeader添加到ListView控件中。

  1. For Each act As Actress In actresses
  2. Dim item As New ListViewItem
  3. item.Text = act.m_name
  4. item.SubItems.Add(act.m_year.ToString())
  5. lv.Items.Add(item)
  6. Next

此循环填充listview控件。 每行都作为ListViewItem类添加到列表视图。

  1. lv.View = View.Details

ListView控件可以具有不同的视图。 不同的视图以不同的方式显示数据。

  1. Dim name As String = lv.SelectedItems(0).SubItems(0).Text
  2. Dim born As String = lv.SelectedItems(0).SubItems(1).Text
  3. sb.Text = name & ", " & born

OnChanged方法内部,我们从选定的行中获取数据并将其显示在状态栏上。

  1. If sender.Sorting = SortOrder.Ascending
  2. sender.Sorting = SortOrder.Descending
  3. Else
  4. sender.Sorting = SortOrder.Ascending
  5. End If

在这里,我们切换列的排序顺序。

进阶控件 - 图2

图:ListView

TreeView

TreeView控件显示项目的分层集合。 此控件中的每个项目都由TreeNode对象表示。

  1. ' ZetCode Mono Visual Basic Winforms tutorial
  2. '
  3. ' This program shows how to use
  4. ' the ListBox control. Item selected from
  5. ' the ListBox is shown in the statusbar.
  6. '
  7. ' author jan bodnar
  8. ' last modified May 2009
  9. ' website www.zetcode.com
  10. Imports System.Windows.Forms
  11. Imports System.Drawing
  12. Public Class WinVBApp
  13. Inherits Form
  14. Private Dim sb As StatusBar
  15. Private Dim WithEvents tv As TreeView
  16. Public Sub New
  17. Me.Text = "TreeView"
  18. Me.Size = New Size(250, 250)
  19. Me.InitUI
  20. Me.CenterToScreen
  21. End Sub
  22. Private Sub InitUI
  23. tv = New TreeView
  24. Dim root As New TreeNode
  25. root.Text = "Languages"
  26. Dim child1 As New TreeNode
  27. child1.Text = "Python"
  28. Dim child2 As New TreeNode
  29. child2.Text = "Ruby"
  30. Dim child3 As New TreeNode
  31. child3.Text = "Java"
  32. root.Nodes.AddRange(New TreeNode() {child1, child2, child3})
  33. tv.Parent = Me
  34. tv.Nodes.Add(root)
  35. tv.Dock = DockStyle.Fill
  36. sb = New StatusBar
  37. sb.Parent = Me
  38. End Sub
  39. Private Sub OnSelected(ByVal sender As Object, _
  40. ByVal e As TreeViewEventArgs) Handles tv.AfterSelect
  41. sb.Text = e.Node.Text
  42. End Sub
  43. Public Shared Sub Main
  44. Application.Run(New WinVBApp)
  45. End Sub
  46. End Class

这是TreeView控件的非常简单的演示。 我们有一个根项目和三个子项。

  1. tv = New TreeView

我们创建TreeView控件。

  1. Dim root As New TreeNode
  2. root.Text = "Languages"
  3. ...
  4. tv.Nodes.Add(root)

在这里,我们创建一个根节点。

  1. Dim child1 As New TreeNode
  2. child1.Text = "Python"

子节点以类似的方式创建。

  1. root.Nodes.AddRange(New TreeNode() {child1, child2, child3})

子节点插入到根节点的Nodes属性中。

  1. Private Sub OnSelected(ByVal sender As Object, _
  2. ByVal e As TreeViewEventArgs) Handles tv.AfterSelect
  3. sb.Text = e.Node.Text
  4. End Sub

处理事件的另一种方法是使用Handles关键字。

进阶控件 - 图3

图:TreeView

在 Visual Basic Winforms 教程的这一部分中,我们介绍了 Winforms 库中提供的三个高级控件。