单元六 文件与资源管理
[学习目标] 本单元主要介绍用VB.NET实现类似的Windows资源管理器。掌握常用的TreeView和ListView 两个控件;掌握VB.NET如何对文件进行读写,同时掌握对文件的复制、粘贴、删除等操作方法;学习并掌握VB.NET通用对话框的设置与编程,如打开对话框、另存为对话框、字体对话框和颜色对话框的设置与编程。
6.1 资源管理技术
【案例6-1】类似Windows资源管理器功能的窗体(1)
----浏览计算机逻辑盘及逻辑盘上的资源(各逻辑盘及逻辑盘上的文件夹及文件夹下的文件)
用TreeView和ListView 两个主要控件及ImageList1控件、StatusBar控件和RichTextBox控件实现类似Windows资源管理器窗体,在TreeView控件中显示计算机中的逻辑盘,当单击某个逻辑盘将显示此逻辑盘中的文件夹,此时选择某个文件夹,在ListView 控件中显示此文件夹中的文件名称等。另外当鼠标位于左右窗格分界处Splitter控件上时,可以调整左右窗格的大小。效果图如图6-1所示。
图6-1 资源管理器'
[技能目标]
能利用前面学习过的控件(ImageList1控件、StatusBar控件和RichTextBox控件)及TreeView控件和ListView控件设计出类似Windows的资源管理器功能的窗体----浏览计算机逻辑盘及逻辑盘上的资源(各逻辑盘及逻辑盘上的文件夹及文件夹下的文件)
[操作要点与步骤]
1. 建立一个新的Windows应用程序,命名为vbnet6-1。
启动VS.NET,新建一个"Windows应用程序"项目,项目名为Vbnet6-1,该项目存放在"D:/VB.net"目录下。
2. 窗体设计
输入完项目名及该项目存放目录按确定按钮后,在所出现的窗体上放置ImageList1控件、TreeView控件、StatusBar控件、ListView控件、Splitter控件和RichTextBox控件
3. 设置窗体及各控件属性
按表6-1的顺序设置窗体及各控件的属性,顺序设置窗体和各控件属性后的窗体如图6-2所示。
表6-1 项目Vbnet6-1中窗体及控件属性
控件名 属性名 设置值
Form Name Frmexplorer
Text 类似WINDOWS资源管理器
ImageList1 Name ImageList1
Images Collection集合属性如图6-3所示
TreeView(先设置好ImageList1控件的属性再设置本控件的属性) Name TreeView1
Dock Left
ImageList ImageList1
Nodes Collection集合属性如图6-4所示
StatusBar Name StaBar
Dock Bottom
Panels Collection集合属性如图6-5所示
ShowPanels True
ListView Name ListView1
Dock Top
View Details
Columns Collection集合属性如图6-8所示
Dock Fill
Splitter Name Splitter1
在工具箱中双击该控件,则此控件自动放在窗体的TreeView和RichTextBox控件之间,且该控件的Dock属性自动为Left。
(1)设置ImageList1控件Images的Collection集合属性
1. ImageList1控件Images的Collection集合属性所需要的图片文件在VB.NET的安装文件夹或在因特网上可以找到。
2. 注意添加图片文件的顺序;第一、二、三、四幅图片所对应的文件名分别是MYCMP.ICO、DRIVDSE.ICO、CLSDFOLD.ICO、OPENFOLD.ICO,对应的图片索引号分别为0、1、2、3。
图6-3 添加ImageList1控件Images的Collection集合属性
(2)设置TreeView1控件Nodes的Collection集合属性(只添加根节点,子节点由程序实现)
图6-4 TreeView1控件Nodes的Collection集合属性
在图6-4中单击"添加根"按钮,在"标签(L)"下的文本框中输入"我的电脑";在"图像(I)"下的下拉列表框中选择第一幅图片;在"选定的图像(S)"下的下拉列表框中选择第一幅图片后按确定按钮。
(3)设置StatusBar控件Panels属性Collection集合属性(SbpFile成员属性)
图6-5 StatusBar控件Panels属性Collection集合属性(SbpFile成员属性)
在图6-5中右半边已经显示SbpFile成员属性;SbpFont和SbpCountnt成员属性分别如图6-6、图6-7所示;这三个成员属性是通过单击图6-5中的"添加"按钮添加的。
(4)设置StatusBar控件Panels属性Collection集合属性(SbpFont成员属性)
图6-6 StatusBar控件Panels属性Collection集合属性(SbpFont成员属性)
(5)设置StatusBar控件Panels属性Collection集合属性(SbpCount成员属性)
图6-7 StatusBar控件Panels属性Collection集合属性(SbpCount成员属性)
(6)设置ListView控件Columns属性的Collection集合属性(FileName成员属性)
在图6-8中右半边已经显示FileName成员属性;LastAccess成员属性如图6-9所示;这二个成员属性是通过单击图6-8中的"添加"按钮添加的。
(7)设置ListView控件Columns属性的Collection集合属性(LastAccess成员属性)
图6-8 ListView控件Columns属性的Collection集合属性(FileName成员属性)
图6-9 ListView控件Columns属性的Collection集合属性(LastAccess成员属性)
4. 完成了界面及各控件的属性设计后,还需要编写代码,才能实现所需要的功能。因为该案例要浏览计算机逻辑盘及逻辑盘上的资源(各逻辑盘上的文件夹及文件夹下的文件),所以首先在程序代码的最开头使用语句Imports System.IO以引用System.IO命名空间;同时为了能完成本单元中所有案例功能,在整个程序模块中应定义一些公共变量。引用命名空间及定义公共变量的代码如下:
Imports System.IO
Public Class frmexplorer
Inherits System.Windows.Forms.Form
Dim strCurrentPath As String
'定义当前目录路径变量
Dim strCurrentfile As String
'定义当前文件名变量
Dim tvCurrentNode As TreeNode
'定义当前目录在树节点中位置的变量
Dim copySourceFile As String,copyFileName As String
Dim contextMenuFocus As Integer
'定义用来确定上下文菜单的弹出位置(在Treeview1还是Listview1)的变量
Dim bModify As Boolean = False
Dim sEditFileName As String
#Region " Windows 窗体设计器生成的代码 "
'此部分代码省略不写,因为按上述步骤1及步骤2操作后,这部分代码会自动生成
#End Region
#Region "浏览磁盘、文件夹及文件的操作,熟悉常用控件 - TreeView和ListView"
#End Region
End Class
5. 为了能够浏览逻辑盘、文件夹,在TreeView1_AfterSelect事件中根据用户所选择节点的类型决定调用不同的自定义函数,如果用户选择的是根节点则调用自定义函数DispDriver(),如果用户选择的是子节点则调用DispDir()自定义函数。为了在用户选择子节点时能够在ListView控件中显示此子节点(文件夹)中的文件,在TreeView1控件中列举完此子节点(文件夹)下文件夹之后再调用DispFile()自定义的函数,在ListView控件中列表显示此子节点(文件夹)中的文件。
调用自定义函数的程序及三个自定义函数DispDriver(),DispDir(),DispFile()的程序代码如下:
#Region "浏览磁盘、文件夹及文件的操作,熟悉常用控件 - TreeView和ListView"
Private Sub TreeView1_AfterSelect(ByVal sender As Object,ByVal e As _
System.Windows.Forms.TreeViewEventArgs) Handles TreeView1.AfterSelect
If e.Node.Text = "我的电脑" Then
'列举驱动器
DispDriver(e.Node)
Else
'列举子文件夹。
DispDir(e.Node)
End If
End Sub
'列举驱动器
Private Sub DispDriver(ByVal node As TreeNode)
Dim drv As String
Dim i As Integer
If node.Nodes.Count = 0 Then
'下面的循环是遍历微机中的逻辑盘并在树节点中增加这些逻辑盘符
For Each drv In Directory.GetLogicalDrives
TreeView1.SelectedNode = node
Dim tmpNode As New TreeNode
'tmpNode.Text = drv.Substring(0,drv.Length)
tmpNode.Text = drv '将逻辑盘符赋值给节点实例tmpNode的属性Text
tmpNode.Tag = drv
tmpNode.ImageIndex = 1
tmpNode.SelectedImageIndex = 1
TreeView1.SelectedNode.Nodes.Add(tmpNode) '在树节点中增加逻辑盘符
TreeView1.SelectedNode.Nodes(i).EnsureVisible()
'在树节点中刚增加逻辑盘符节点可见
i = i + 1
Next
End If
End Sub
Private Sub DispDir(ByVal node As TreeNode)
Try
TreeView1.SelectedNode = node
Dim DirectoryPath As String = node.Tag.ToString()
If node.Nodes.Count = 0 Then
'下面的条件判断是保证所选定的目录路径名的最后一个字符为 "/"
If DirectoryPath.Substring(DirectoryPath.Length - 1) <> "/" Then
DirectoryPath += "/"
End If
strCurrentPath = DirectoryPath '保存当前选定的文件夹的目录路径
tvCurrentNode = TreeView1.SelectedNode '保存当前选定的树节点中位置
Dim Dir As String
Dim i As Integer
'下面的循环是遍历选定的逻辑盘或文件下的子文件夹并在树节点中增加这些子文件夹
For Each Dir In Directory.GetDirectories(DirectoryPath)
Dim tmpNode As New TreeNode
tmpNode.Text = Dir.Substring(Dir.LastIndexOf("/") + 1)
tmpNode.Tag() = Dir
tmpNode.ImageIndex = 2
tmpNode.SelectedImageIndex = 3
'当在树节点中选定某文件夹,显示索引号为3的图形(即是打开文件夹的图形)
TreeView1.SelectedNode.Nodes.Add(tmpNode)
TreeView1.SelectedNode.Nodes(i).EnsureVisible()
i += 1
Next
End If
ListView1.Update()
DispFile(node) '列举完文件夹之后再列表显示这个文件夹中的文件。
Catch ex As Exception
End Try
End Sub
Private Sub DispFile(ByVal node As TreeNode)
Dim DirectoryPath As String = node.Tag.ToString()
'下面的条件判断是保证所选定的目录路径名的最后一个字符为 "/"
If DirectoryPath.Substring(DirectoryPath.Length - 1) <> "/" Then
DirectoryPath += "/"
End If
Try
ListView1.Items.Clear()
Dim tmpFile As String
Dim lvItem As ListViewItem
For Each tmpFile In Directory.GetFiles(DirectoryPath)
lvItem = New ListViewItem(Path.GetFileName(tmpFile)) '文件名称
lvItem.SubItems.Add(File.GetLastAccessTime(tmpFile))
ListView1.Items.Add(lvItem)
'将文件名称这个项目加载到ListView中(它的子项目在第二列显示)
Next
ListView1.Update()
Catch ex As Exception
End Try
End Sub
#End Region
6. 项目的保存与运行
代码输入完成,先将项目保存,然后按F5键或单击工具栏上的运行按钮运行该项目,项目运行后,在左窗格中会将计算机中的逻辑盘符显示在出来,选择逻辑盘的某个文件夹,则此文件夹下的文件将会在右窗格中显示,效果图如图6-1所示。
[相关知识]
TreeView 控件又称为树型视图控件,工具箱中的图标为 。TreeView 控件类似于在 Windows 资源管理器左窗格中显示文件夹和文件的方式显示节点的层次结构。每个节点可能包含称为子节点的其他节点。父节点或包含子节点的节点可以以展开或折叠的方式显示。
1. TreeView 控件的主要属性
(1)Nodes 属性
Nodes属性是TreeView控件最重要的属性,它是一个集合属性,Nodes集合包含分配给 TreeView控件的所有TreeNode对象。此集合中的树节点称作根树节点。随后添加到根树节点上的任何树节点称作子节点。
可以在图6-4中TreeView控件节点编辑器向TreeView控件添加根节点和子节点,每个节点的名称可以通过"标签"设置,各节点折叠时的图像可以在"图像"下拉列表框中设置,各节点展开时的图像可以在"选定的图像"下拉列表框中设置。可以通过在图6-4中添加节点并设置各节点的属性,也可以用编程的方式实现(案例6-1就是用编程方式实现的),Nodes集合属性如图6-10所示,Nodes集合属性的功能说明如表6-2所示。
图6-10 Nodes集合属性
FirstNode 属性 FirstNode返回当前节点的第一个子节点。如果当前节点没有子节点,则 FirstNode 属性返回空(Nothing)。
LastNode 属性 LastNode 返回当前节点的最后一个子节点。如果当前节点没有子节点,则 LastNode 属性返回空(Nothing)。
NodeFont 属性 返回或设置当前节点的字体
PrevVisbleNode 属性 返回当前节点的上一个可见节点
PrevNode 属性 返回当前节点的上一个节点(无论该节点是否可见)
NextVisbleNode 属性 返回当前节点的下一个可见节点
NextNode 属性 返回当前节点的下一个节点(无论该节点是否可见)
Parent 属性 返回当前节点的父节点
IsExpanded 属性 返回当前节点是否已经展开
IsSelected 属性 返回当前节点是否被选中
FullPath 属性 返回该节点的的完整路径
Nodes属性是集合属性,即当前节点的子节点Nodes属性与表6-2相同。
(2)SelectedNode属性
SelectedNode属性用来设置或返回当前被选中的节点,它也是一个集合属性,它的集合属性的子属性和方法与Nodes集合属性的子属性和方法基本相同。
(3)ImageList属性(必须使TreeView 控件与 ImageList 控件相关联)
Windows 窗体 TreeView 控件可在每个节点旁显示图标。图标紧挨着节点文本的左侧。若要显示这些图标,必须使TreeView 控件与 ImageList 控件相关联;关联的方法可以用手工方式在设计器中使用"属性"窗口设置,也可以用编程的方式实现。
用编程的方式实现将 TreeView 控件的 ImageList 属性设置为希望使用的ImageList 控件的代码如下:
TreeView1.ImageList = ImageList1
①ImageIndex 属性
只有设置TreeView 控件的ImageList属性与ImageList 控件相关联后,才能设置ImageIndex 属性。
ImageIndex 属性为TreeView 控件中的节点设置默认图像,ImageIndex 属性确定为正常和展开状态下的节点显示的图像。节点旁边显示图像由ImageIndex 属性值从TreeView 控件的 ImageList 属性中命名的 ImageList 控件获取图像。
②SelectedImageIndex 属性
SelectedImageIndex 属性确定为选定状态下的节点显示的图像。选定状态下节点旁边显示图像由SelectedImageIndex属性值从TreeView 控件的 ImageList 属性中命名的 ImageList 控件获取图像。
ImageIndex 属性,SelectedImageIndex属性可在代码中设置,也可在"树节点编辑器"中设置(如图6-4)。
TreeView 控件的 CheckBoxes 属性的功能可以决定是否在节点旁显示复选框;当该属性设置为 True,则在显示树视图时,节点旁边带有复选框,此时,用户可以通过单击鼠标选中或取消节点旁的复选框以决定节点是显示或清除;当然用户也可以通过编程的方式在程序中将节点的 Checked 属性设置为 true 或 false以决定节点是显示或清除。
(5)Indent属性
Indent属性用来设置父节点与子节点之间的水平缩进距离。
(6)LabelEdit属性
(7)PathSeparator属性
PathSeparator属性获取或设置节点路径所使用的分隔符串,缺省的分隔符为"/"。
(8)Scrollable属性
Scrollable属性获取或设置当TreeView 控件中的节点超出边界时是否添加滚动条,缺省值为True。
(9)Sorted属性
Sorted属性获取或设置是否将TreeView控件中的节点按字母顺序排序。
(10)VisibleCount属性
VisibleCount 返回TreeView控件中完全可见的树节点的数目,该属性是一个只读属性。
(11)HotTracking属性
HotTracking 返回或设置当鼠标指针移过树节点标签时,树节点标签是否具有超级链接的外观。
(12)ShowLines属性
ShowLines属性返回或设置是否显示在TreeView控件的父子节点之间的关系线,缺省值为True。
(13)ShowPlusMinus属性
ShowPlusMinus属性返回或设置是否在包含有子节点的父节点前显示加号 (+) 和减号 (-) 按钮,缺省值为True。加号 (+) 表示该项目没有展开,单击加号 (+) 可以展开项目,此时显示减号 (-),单击减号 (-)将折叠该项目,减号 (-)又变成加号 (+) 。
(14)ShowRootLines属性
ScrollableShowRootLines属性返回或设置是否显示TreeView控件根节点之间连线,缺省值为True。
ShowLines属性、ShowPlusMinus属性、ShowRootLines属性最好保留它们的缺省属性值,因为这三个属性值都为True时,父节点和子节点的树状结构关系会显示的清晰明了。
2. TreeView 控件常用事件
(1)BeforeSelect事件和AfterSelect事件
在选中节点"前","后"触发。AfterSelect事件是在设计器上双击TreeView 控件默认打开的事件,也是最常用的事件(案例6-1使用了TreeView 控件的AfterSelect事件)。
(2)BeforeCollapse事件和AfterCollapse事件
当节点折叠"前","后"触发。当子节点展开的时候,单击父节点使子节点收敛前后分别触发BeforeCollapse事件和AfterCollapse事件。
(3)BeforeExpand事件和AfterExpand事件
这两个事件与BeforeCollapse事件和AfterCollapse事件刚好相反,BeforeExpand事件和AfterExpand事件分别在节点展开"前","后"触发。
(4)AfterLabelEdit事件和BeforeLabelEdit事件
这两个事件在编辑节点的标签文本"前","后"触发。
(5)BeforeSelect事件和AfterSelect事件
这两个事件在选定节点"前","后"触发。
(6)BeforeCheck事件和AfterCheck事件
当TreeView 控件的CheckBoxes 属性设置为 True时,当选中节点前的复选框"前","后"触发。
3. TreeView 控件常用方法
(1)CollapseAll方法
CollapseAll 方法可以将所有TreeView控件中展开的节点折叠起来。
调用的格式为:TreeView1. CollapseAll()
(2)ExpandAll方法
ExpandAll方法可以将所有TreeView控件中折叠的节点都展开。
调用的格式为:TreeView1. ExpandAll ()
(3)GetNodeAt方法
GetNodeAt方法可以检索位于指定位置的节点。
调用的格式为:TreeView1. GetNodeAt(x as integer,y as integer)
(4)GetNodeCount方法
GetNodeCount方法可以返回TreeView控件的节点数,返回TreeView控件的节点数根据调用此方法时传递的逻辑参数值的不同而不同。如果调用此方法时传递的逻辑参数值为True,则返回的节点数是包括子节点的;如果调用此方法时传递的逻辑参数值为False,则返回的节点数是不包括子节点的;
调用的格式为:TreeView1.GetNodeCount(IncludeSubtrees as Bollean)
ListView控件又称为列表视图控件,工具箱中的图标为 。ListView控件可以把所需要列出项目很清楚地罗列出来,如列出逻辑盘上某文件夹下的文件、数据库中的表名或表中某些字段的记录值等。
1. ListView控件的主要属性
(1)View属性
列表的方式可以有"大图标"、"详细资料"、"小图标"、"列表"四种方式,用户选择四种方式的一种方式显示列表项可以通过对ListView控件的View属性设置,ListView控件的View属性设置方法如图6-11所示。
LargeIcon是大图标显示方式(默认值),Details是详细列表显示方式,SmallIcon是小图标显示方式,List是列表显示方式。
(2)LargeImageList属性
LargeImageList属性是用来设置ListView控件的列表项的图标。实际上其值是指定某个ImageList控件。当ListView控件的列表项以大图标显示时,设置此属性。
(3)SmallImageList属性
SmallImageList属性是用来设置ListView控件的列表项的图标。实际上其值是指定某个ImageList控件。当ListView控件的列表项以小图标显示时,设置此属性。
(4)StateImageList属性
StateImageList属性是用来设置ListView控件的列表项的图标。实际上其值是指定某个ImageList控件。当ListView控件的列表项以除大图标和小图标显示时,设置此属性。
(5)LabelEdit属性
LabelEdit 属性返回或设置是否允许对列表项目标题的编辑。
(6)MultiSelect属性
MultiSelect 属性是用来设置是否可以进行多项选择,默认值为True。
(7)GridLines属性
GridLines属性是用来设置是否将列表项显示为表格形式,默认值为False。
(8)HeaderStyle属性
HeaderStyle属性是用来设置表头风格,默认值为Clickable,表示可以响应鼠标单击并可按该列表内容对项目排序;None为不显示表头;NoneClickable不响应鼠标单击。
(9)Sorted属性
Sorted属性用来设置ListView控件的列表项排序方式,默认值为None,表示不设置排序;Ascending表示按开头字母升序排列;Descending则表示按开头字母降序排列。
(10)FocusedItem属性
(11)Columns集合属性
Columns集合属性是用来设置ListView控件的列表头,只有当ListView控件的View属性设置为Details才会显示ListView控件的列表头。用户可以通过单击属性窗口中Columns属性右边的 按钮,通过图6-8和图6-9所示的"ColumnsHeader集合编辑器"向ListView控件中添加列表头。
Columns集合属性主要是设置列表项的属性,列表头项的常用属性如表6-3所示。
表6-3 列表头项的常用属性
width 属性 用来设置列表头项的宽度
textalign 属性 用来设置列表头显示的文本对齐方式:left为居左、center为居中、right为居右
(12)Items集合属性
Items集合属性是用来设置ListView控件的列表项信息,用户可以通过单击属性窗口中Items属性右边的 按钮,通过操作"ListViewItem集合编辑器"(图6-12)向ListView控件中添加列表项。
图6-12 ListViewItem集合编辑器
在图6-12 ListViewItem集合编辑器中有成员属性SubItems,当单击该属性右边的 按钮会出现图6-13所示的ListViewSubItem集合编辑器,向ListView控件中添加次列表项SubItem。
刚出现图6-13ListViewSubItem集合编辑器时,左边索引号为0的项是自动产生的,它表示是该SubItem的主项。
图6-13 ListViewSubItem集合编辑器
用户也可以在程序代码中利用Items集合属性的Add和Clear方法向Items集合里动态添加和删除列表项。
2. ListView 控件常用事件(如表6-4所示)
表6-4 ListView 控件常用事件
事件名 事件说明
Click事件 在单击控件时发生。
ColumnClick事件 单击列标头时触发。
DoubleClick事件 在双击控件时发生。
ItemActivate事件 当ListView 控件的列表项被激活时触发。
TabIndexChanged事件 TabIndex 属性值更改时发生。
LostFocus事件 当控件失去焦点时发生。
SelectedIndexChanged事件 当列表控件中从某一个选定的列表项跳转到某个列表项时触发。
3. ListView 控件常用方法
(1)Clear方法
从ListView控件中移除所有项和列。
(2) GetItemAt方法
GetItemAt方法可以检索位于指定位置的项。
调用的格式为:ListView. GetNodeAt(x as integer,y as integer)
System.IO命名空间包含与I/O相关的类,它提供了基于对象的工具。System.IO命名空间提供以下功能:
3. 从流中读写数据或字符(包括多字节字符,并可以直接读写各种数据类型)。
在使用与I/O操作有关的类,必须引用System.IO命名空间。引用System.IO命名空间的方法是在程序代码的最开头加上如下的语句:
Imports System.IO
Directory类的典型操作是复制、移动、重命名、创建和删除文件夹;也可将 Directory 类用于获取和设置与文件夹的创建、访问及写入操作相关的DateTime信息。
表6-5 列出了Directory 类的常用方法
表6-5 Directory 类的常用方法
CreateDirectory 方法 按指定的路径创建文件夹或子文件夹。例如:Dim dir As New Directory("d:/server")
GetLogicalDrives 方法 检索此计算机上格式为"<驱动器号>:/"的逻辑驱动器的名称。例如:For Each drv In Directory.GetLogicalDrives
GetDirectories 方法 获取指定文件夹中子文件夹的名称。例如:For Each Dir In Directory.GetDirectories(DirectoryPath)
GetCurrentDirectory 方法 获取应用程序的当前工作文件夹。例如:dir= GetCurrentDirectory()
GetFiles 方法 返回指定文件夹中的文件的名称。例如:For Each tmpFile In Directory.GetFiles(DirectoryPath)
GetLastAccessTime 方法 返回上次访问指定文件或文件夹的日期和时间。例如lvItem.SubItems.Add(File.GetLastAccessTime(tmpFile))
GetParent方法 检索指定路径的父文件夹,包括绝对路径和相对路径。例如:dir= GetParent ()
GetDirectoryRoot方法 返回指定路径的卷信息、根信息或两者同时返回。例如:dir= GetDirectoryRoot ()
Exists方法 确定给定路径是否存在某文件夹。例如:dir =Directory. Exists (DirectoryPath)
Move 方法 将文件或文件夹及其内容移到新位置。例如:Directory. Move ("d:/server","c:/temp")
Delete方法 删除文件夹及其内容。例如:Directory. Delete("c:/temp")
6.2 文件访问技术
【案例6-2】类似Windows资源管理器功能的窗体(2)
--对显示在ListView控件内的文件进行复制、粘贴、删除等操作。
该案例可以对显示在ListView控件内的文件进行复制、粘贴、删除等操作;当首次在ListView控件的空白处右击鼠标时,则弹出的菜单都是灰化的;在某个文件上右击鼠标时,弹出的菜单只显示复制文件和删除文件菜单;如果单击显示复制文件菜单后,再右击鼠标,则会出现粘贴文件菜单;如果在某个文件上右击鼠标选择弹出的删除文件菜单,则会出现如图6-14所示的消息框。该案例还可以实现:在ListView控件中显示的文件上双击文本文件,则会在RichTextBox1控件中显示该文本文件的内容;如果双击的文件不是文本文件,则会在RichTextBox1控件显示该文件的扩展名类型信息。效果图如图6-15所示。
图6-15 案例6-2的效果图(对文件进行显示、复制、粘贴、删除等操作)
[技能目标]
[操作要点与步骤]
1. 将案例6-1所在的文件夹vbnet6-1复制到文件夹vbnet6-2,打开vbnet6-2文件夹下的vbnet6-1.sln文件。
2. 单击"解决方案资源管理器"窗口中的"解决方案"vbnet6-1"(1项目)",将名称由原来的vbnet6-1改为vbnet6-2。
3. 单击"解决方案资源管理器"窗口中的"vbnet6-1项目,将属性窗口中的"项目文件"属性改为vbnet6-2.vbproj。
4. 弹出式菜单设计
将工具箱中的弹出式菜单控件拖放到窗体内,由于弹出式菜单控件在项目运行时不可见,所以该控件自动被放在窗体的下方显示。拖放好上下文菜单控件后请按表6-6设置弹出式菜单各菜单项的属性。
控件名 属性名 设置值
弹出式菜单ContextMenu1 Name Mnucopy
Text 文件复制
Name Mnupaste
Text 文件粘贴
Name Mnudelete
5. 将ListView1控件的ContextMenu属性设置为ContextMenu1。
6. 编写代码。因为该案例要求根据是否在ListView1控件的空白处右击鼠标决定上下文菜单的可操作项,所以编写事件代码如下:
Private Sub ContextMenu1_Popup(ByVal sender As Object,ByVal e As System.EventArgs) _
Handles ContextMenu1.Popup
' 根据是否在ListView1控件的空白处右击鼠标,上下文菜单弹出时设置弹出时的初始状态。
' 注意ListView的MultiSelect属性应为False
If ListView1.SelectedItems.Count = 0 Then
mnucopy.Enabled = False
Mnudelete.Enabled = False
Else
mnucopy.Enabled = True
Mnudelete.Enabled = True
End If
If copySourceFile = "" Then
Mnupaste.Enabled = False
Else
Mnupaste.Enabled = True
End If
End Sub
Private Sub Mnudelete_Click(ByVal sender As System.Object,ByVal e As System.EventArgs) _
Handles Mnudelete.Click
Try
Dim strDeteteItem As String
Dim lvItem As ListViewItem
Dim yesno As Integer
lvItem = ListView1.SelectedItems(0)
strDeteteItem = ListView1.SelectedItems(0).Text
yesno = MsgBox("你真的要删除 " & strDeteteItem & " 这个文件吗?",_
If yesno = 6 Then
File.Delete(strCurrentPath + "/" + strDeteteItem) ' 删除文件
ListView1.Items.Remove(lvItem) ' 更新列表视图
End If
Catch ex As Exception
End Try
End Sub
Private Sub Mnucopy_Click(ByVal sender As System.Object,ByVal e As System.EventArgs) _
Handles mnucopy.Click
If ListView1.Items.Count > 0 Then ' 确定是否有项目被选中
copyFileName = ListView1.SelectedItems(0).Text
copySourceFile = strCurrentPath + "/" + copyFileName
End If
End Sub
Private Sub Mnupaste_Click(ByVal sender As System.Object,ByVal e As System.EventArgs) _
Handles Mnupaste.Click
If File.Exists(copySourceFile) = False Then
' 判断要拷贝的文件是否存在
MsgBox("不存在这个文件,请重新拷贝",MsgBoxStyle.Information,"提示")
Exit Sub
Else
CheckFileExist(copyFileName)
File.Copy(copySourceFile,strCurrentPath + "/" + copyFileName)
' 复制文件到所要的地方
ListView1.Items.Add(copyFileName)
ListView1.Update()
End If
End Sub
Private Sub CheckFileExist(ByVal strFileName As String)
' 采用递归的办法,当发现复制目录下有同名文件时,在要复制的文件名前加Copy字符
If File.Exists(strCurrentPath + "/" + copyFileName) Then
copyFileName = "Copy" & copyFileName
CheckFileExist(copyFileName)
Else
Exit Sub
End If
End Sub
8. 为了在ListView1控件双击文本文件能在RichTextBox1控件内显示文本文件的内容,如果双击的不是文本文件,则显示该文件的扩展名信息。程序代码如下:
#Region "在ListView1控件双击文本文件则在RichTextBox1控件内显示文本文件的内容,如果双击 _
的不是文本文件,则显示该文件的扩展名。熟悉文件流的读、写操作。"
Private Sub ListView1_DoubleClick(ByVal sender As Object,ByVal e As System.EventArgs) _ Handles ListView1.DoubleClick
Dim strFilePath As String ' 文件路径
Dim Mystream As StreamReader ' 定义读流对象
Dim strItemName As String ' 激活的文件名
Dim intLength,i As Integer
Dim strXName As String ' 文件扩展名
strItemName = ListView1.SelectedItems(0).Text
strCurrentfile = strItemName
intLength = strItemName.Length
strFilePath = strCurrentPath + "/" + strItemName ' 取得当前物理路径
' 下面的循环是判断文件类型
For i = intLength - 1 To 0 Step -1
If strItemName.Chars(i) = "." Then Exit For
Next
strXName = strItemName.Substring(i)
If strXName = ".txt" Or strXName = ".TXT" Then
' 如果是文本文件,打开文件,并将文件写入RichtextBox对象中
RichTextBox1.Text = "该文本文件中的内容:" & Chr(13)
Mystream = File.OpenText(strFilePath)
While Mystream.Peek() <> -1 ' 判断是否到达文件尾
RichTextBox1.AppendText(Mystream.ReadLine())
End While
Mystream.Close()
Else
RichTextBox1.Text = strXName + "类型文件" '如果不是仅显示扩展名
End If
End Sub
#End Region
9. 项目的保存与运行
代码输入完成,先将项目保存,然后按F5键或单击工具栏上的运行按钮运行该项目,项目运行后,会出现如图6-15所示的效果图。
[相关知识]
文件是存储在媒体介质上的数据集合。文件类可以实现创建文件、复制文件、删除文件、移动文件等任务。System.IO 命名空间包含 File 和 Directory 类,它们可以提供操纵文件和文件夹所需的基本功能。File 类的常用方法见表6-7所示。
表6-7 File 类方法
AppendText 创建 StreamWriter 的一个实例,将 UTF-8 编码文本附加到现有文件。
Create 以指定的完全限定路径创建文件。
CreateText 创建或打开一个新文件,用于编写 UTF-8 编码文本。
Exists 返回 Boolean 值,表明指定文件是否存在。
GetAttributes 返回完全限定路径的文件的 FileAttributes。
GetCreationTime 返回 Date,表示指定文件的创建时间。
GetLastAccessTime 返回 Date,表示最近一次访问指定文件的时间。
GetLastWriteTime 返回 Date,表示最近一次写入指定文件的时间。
Open 打开指定路径的 FileStream。
OpenRead 打开现有文件以进行读取。
OpenText 打开现有的 UTF-8 编码文本文件以进行读取。
OpenWrite 打开现有文件以进行写入。
SetAttributes 设置指定路径中的文件的指定 FileAttributes。
SetCreationTime 设置指定文件的创建日期和时间。
SetlastAccessTime 设置最近一次访问指定文件的日期和时间。
SetLastWriteTime 设置最近一次写入指定文件的日期和时间。
VB.NET与VB一样,也有三种文件类型,这三文件类型分别是:顺序文件、随机文件和二进制文件。
1. 顺序文件类型:顺序文件类型也称为文本字符流式文件,它是普通的纯文本文件,通常用于存储字符、数字或其他可用的ASCII字符表示的数据,但不能存储像位图这样的信息。该文件中的每一个字符都是由一个文本字符或文件格式字符(回车、换行等)所组成。
2. 随机文件类型:随机文件类型,允许以记录的方式存储和访问信息,这种方法的随机文件由一组相同长度的记录组成,记录可以由标准数据类型的单一字段组成,或者由多个字段组成(如班级的课程由多门课程所组成)。每个字段的数据类型和长度可以不同,但文件每条记录的长度是相同的。随机型的访问类型允许访问随机文件的任何记录。
3.二进制文件类型:它适用于访问具有任意结构的文件,因此这也是一种最通用的访问类型。它实际上是以字节为单位对文件进行访问的,而不管是什么文件都可以认为是由字节构成的。因为在访问二进制文件类型时可以将文件指针移到任何位置,所以它对于变长字段尤为适用。
1. 流的概念
在VB.NET中,引入了一种新的数据格式-流,这种格式也可以通过System.IO 命名空间下的类访问。流使用Stream类表示,所有表示流的类都是从这个类中继承的。流向用户提供了一个一般的数据视图,隐藏了操作系统和底层设备的实现细节,所有的流都支持读写操作。打开文件时将返回对应的流对象,用户便可以对流对象进行读写操作。
2. StreamReader类和StreamWriter类
System.IO 提供了通过使用特定编码从流或文件中读取字符和将字符写入流或文件中的类。它包括:StreamReader类和StreamWriter类,这一对类可以直接从文件读取字符顺序流或将字符顺序流写入文件中,它们是以文本方式读取和写入信息的。
StreamReader类可以从流或文件读取字符;在创建StreamReader类的对象时,可以指定一个流对象,也可以指定一个文件路径,创建对象之后就可以调用它的方法,从流中读取数据,StreamReader类提供了以下常用的方法从流中读取数据(见表6-8所示):
表6-8 StreamReader类读取数据常用方法
Peek 返回下一个可用的字符,但不使用它。
Read 读取输入流中的下一个字符或下一组字符并移动流或文件指针。
ReadBlock 从当前流中读取最大数量的字符并从 index 开始将该数据写入 buffer。
ReadLine 从当前流中读取一行字符并将数据作为字符串返回。
ReadToEnd 从流的当前位置到末尾读取流。
StreamWriter类可以将字符写入流或文件。StreamWriter 类提供了以下常用的方法将字符写入流或文件中(见表6-9所示):
Write 写入流,向流对象中写入字符并移动流或文件指针。
WriteLine 向流中写入一行,后跟行结束符。
StreamReader类和StreamWriter类的默认编码均为UTF-8,而不是当前系统的ANSI编码。UTF-8可以正确处理Unicode字符。因此如果用StreamReader类和StreamWriter类读写的文件流不是默认编码为UTF-8的文本文件,应该将该文本文件另存为编码为UTF-8的文本文件,另存为的界面如图6-16所示。
StreamReader类和StreamWriter类都有Close方法,Close方法都可以关闭该对象,并释放相关联的系统资源。
图6-16 另存为编码为UTF-8的文本文件
6.3 对话框控件
【案例6-3】类似Windows资源管理器功能的窗体(3)-利用对话框控件实现文件的打开等操作。
该案例通过操作加载在窗体上的下拉式菜单实现用对话框将文件打开,将打开的文件在RichTextBox1控件内显示,然后再对显示在RichTextBox1控件内的文字内容用字体对话框和颜色对话框对其进行字体和颜色的设置等;所有的操作状态在状态栏上显示。效果图如图6-17到图6-21所示。
图6-17 案例6-3的效果图(使用对话框控件)
通过单击图6-17中文件菜单中的打开、保存及格式菜单下的颜色、字体菜单项分别会显示如图6-18、图6-19、图6-20、图6-21所示的对话框。
图6-18 打开文件对话框
图6-19 另存为对话框
图6-20 颜色对话框 图6-21 字体对话框
[技能目标]
1.复习下拉式菜单。
2.会使用对话框控件生成各种常规对话框。
[操作要点与步骤]
1. 将案例6-2所在的文件夹vbnet6-2复制到文件夹vbnet6-3,打开vbnet6-3文件夹下的vbnet6-2.sln文件。
2. 单击"解决方案资源管理器"窗口中的"解决方案"vbnet6-2"(1项目)",将名称由原来的vbnet6-2改为vbnet6-3。
3. 单击"解决方案资源管理器"窗口中的"vbnet6-2项目,将属性窗口中的"项目文件"属性改为vbnet6-3.vbproj。
4. 下拉式菜单设计
将工具箱中的下拉式菜单控件拖放到窗体内,由于下拉式菜单控件在项目运行时不可见,所以该控件自动被放在窗体的下方显示。拖放好下拉式菜单控件后请按表6-10设置下拉式菜单各菜单项的属性。
控件名 属性名 设置值
下拉式菜单MainMenu1一级菜单 Name MenuFile
Text 文件(&F)
Name MenuEdit
Text 编辑(&E)
Name MnFormat
Text 格式
Text 新建(&N)
Name MnOpenOld
Text 打开(&O)
Name MnSave
Text 保存(&S)
Name MenuItem1
Text -
Name MnEnd
Text 结束(&X)
Text 撤消(&U)
Name MenuItem2
Text -
Name MnCut
Text 剪切(&T)
Name MnCopy
Text 复制(&C)
Name MnPaste
Text 粘贴(&P)
Name MmDelete
Text 删除(&D)
Name MenuItem3
Text -
Name MnSelectAll
Text 全选(&A)
一级菜单"格式"下的二级菜单 Name MnWordWrap
Text 自动换行(&W)
checked True
Name MnColor
Text 颜色
Name MnFont
Text 字体
5. 将窗体frmexplorer 控件的Menu属性设置为MainMenu1。
6. 完成以上五步后,现开始编写程序代码。为了在程序运行时能在RichTextBox1控件中显示案例的功能及操作方法及在状态栏显示初始状态,编写了Form1_Load事件代码;在用户单击关闭窗体或单击"结束"菜单时,根据RichTextBox1_TextChanged事件中逻辑变量bModify 的值为 True时,会提示用户是否保存RichTextBox1控件中的文本到文件中,为此在结束程序中编写了Form1_Closed 和MnEnd_Click两个事件,在这两个事件中调用了EndProgram()函数。程序的开始与结束代码如下:
#Region "程序的开始与结束"
'程序开始代码
Private Sub Form1_Load(ByVal sender As System.Object,ByVal e As System.EventArgs) Handles MyBase.Load
RichTextBox1.Text = "文本文件管理器,可以方便的浏览文本文件" + Chr(13)
RichTextBox1.AppendText("使用鼠标右键可以完成基本的文件的复制、粘贴、删除等操作;通过操作下拉式菜单可以通过对话框打开、保存文件等操作")
sEditFileName = "未命名"
'显示目前使用的字体与大小
StaBar.Panels(1).Text = RichTextBox1.Font.Name & " " & RichTextBox1.Font.Size.ToString & "pt"
StaBar.Panels(2).Text = "字符数 : " & RichTextBox1.Text.Length
End Sub
'程序结束代码
Private Sub MnEnd_Click(ByVal sender As System.Object,ByVal e As System.EventArgs) Handles MnEnd.Click
EndProgram()
End Sub
Private Sub Form1_Closed(ByVal sender As Object,ByVal e As System.EventArgs) Handles MyBase.Closed
EndProgram()
End
End Sub
Sub EndProgram()
Dim rBtn As MsgBoxResult
If bModify = True Then '文件尚未保存,询问是否要保存
rBtn = MsgBox(sEditFileName & "尚未保存,是否要保存?",MsgBoxStyle.YesNoCancel,"询问是否要保存")
If rBtn = MsgBoxResult.No Then : End '直接结束程序
ElseIf rBtn = MsgBoxResult.Yes Then
SaveTextToFile() '调用 SaveTextToFile()存储文件
Else : Return '回到程序
End If
End If
End '结束程序的执行
End Sub
Private Sub RichTextBox1_TextChanged(ByVal sender As System.Object,ByVal e As System.EventArgs) Handles RichTextBox1.TextChanged
StaBar.Panels(2).Text = "字符数 : " & RichTextBox1.Text.Length
If bModify = False Then
StaBar.Panels(0).Text &= "*"
End If
End Sub
#End Region
7. 完成以上六步后,现开始为下拉式菜单各菜单项的Click事件编写代码,首先编写文件菜单所对应的菜单项的Click事件代码,通过对话框的操作可以将打开的文本文件在RichTextBox1控件中显示,并能对控件中的内容进行字处理(打开、保存、字体、颜色等)
#Region "文件的操作"
Private Sub MnOpenNew_Click(ByVal sender As System.Object,ByVal e As System.EventArgs) Handles MnOpenNew.Click
If bModify = True Then AskForSaveFile()
sEditFileName = "未命名" : RichTextBox1.Text = "" '清除文本框
StaBar.Panels(0).Text = sEditFileName
End Sub
Private Sub MnOpenOld_Click(ByVal sender As System.Object,ByVal e As System.EventArgs) Handles MnOpenOld.Click
If bModify = True Then AskForSaveFile()
OpenFileToText()
End Sub
Private Sub MnSave_Click(ByVal sender As System.Object,ByVal e As System.EventArgs) Handles MnSave.Click
SaveTextToFile()
End Sub
Sub SaveTextToFile()
Dim filename As String
Dim fnum As Integer
SaveFileDialog1.Filter = "文本文件 (*.txt)|*.txt"
SaveFileDialog1.FileName = sEditFileName
If SaveFileDialog1.ShowDialog() = DialogResult.OK Then
filename = SaveFileDialog1.FileName
StaBar.Panels(0).Text = filename '显示文件名称
Else : Return
End If
sEditFileName = filename '显示目前编辑的文件名称
'将 文件保存到filename所指定的
fnum = FreeFile()
FileOpen(fnum,filename,OpenMode.Output) '打开文件
PrintLine(fnum,RichTextBox1.Text) '将文件输出
StaBar.Panels(0).Text = StaBar.Panels(0).Text.TrimEnd("*")
End Sub
Sub OpenFileToText()
Dim filename As String '打开 filename所指定的文件
Dim fnum As Integer,sInput As String
OpenFileDialog1.Filter = "文本文件 (*.txt)|*.txt"
OpenFileDialog1.InitialDirectory = "D:/" '记得改变这里的路径
If OpenFileDialog1.ShowDialog() = DialogResult.OK Then
filename = OpenFileDialog1.FileName
StaBar.Panels(0).Text = filename
Else : Return
End If
sEditFileName = filename '设定目前编辑的文件名称
fnum = FreeFile()
RichTextBox1.Text = "" '清除 TextBox1的内容
FileOpen(fnum,OpenMode.Input) '打开文件
While Not EOF(fnum) '读取文件
sInput = LineInput(fnum)
RichTextBox1.Text &= sInput & vbCrLf
End While
FileClose(fnum)
bModify = False
StaBar.Panels(0).Text = sEditFileName
End Sub
Sub AskForSaveFile()
Dim rBtn As MsgBoxResult
rBtn = MsgBox(sEditFileName & "尚未保存,是否要保存?",MsgBoxStyle.YesNo,"保存提示")
If rBtn = MsgBoxResult.Yes Then SaveTextToFile()
End Sub
#End Region
8. 编写编辑菜单所对应的菜单项的Click事件编写代码,通过操作编辑菜单的各菜单项,实现对RichTextBox1控件中显示的信息进行撤消、剪切、复制、粘贴、删除和全选等操作。
#Region "编辑"
Private Sub MnUndo_Click(ByVal sender As System.Object,ByVal e As System.EventArgs) Handles MnUndo.Click
RichTextBox1.Undo() '撤消
End Sub
Private Sub MnCut_Click(ByVal sender As System.Object,ByVal e As System.EventArgs) Handles MnCut.Click
RichTextBox1.Cut() '剪切
End Sub
Private Sub MnCopy_Click(ByVal sender As System.Object,ByVal e As System.EventArgs) Handles MnCopy.Click
RichTextBox1.Copy() '复制
End Sub
Private Sub MnPaste_Click(ByVal sender As System.Object,ByVal e As System.EventArgs) Handles MnPaste.Click
RichTextBox1.Paste() '粘贴
End Sub
Private Sub MmDelete_Click(ByVal sender As System.Object,ByVal e As System.EventArgs) Handles MmDelete.Click
RichTextBox1.Cut() '用 Cut来实现删除
End Sub
Private Sub MnSelectAll_Click(ByVal sender As System.Object,ByVal e As System.EventArgs) Handles MnSelectAll.Click
RichTextBox1.SelectAll() '全选
End Sub
#End Region
9. 最后编写格式菜单所对应的菜单项的Click事件编写代码,通过操作格式菜单的各菜单项,实现对在RichTextBox1控件中显示的信息进行字体和颜色等设置,为此分别编写了两个函数Stfont()和Setcolor()。
#Region "格式"
Private Sub MnColor_Click(ByVal sender As System.Object,ByVal e As System.EventArgs) Handles MnColor.Click
SetColor()
End Sub
Private Sub MnFont_Click(ByVal sender As System.Object,ByVal e As System.EventArgs) Handles MnFont.Click
SetFont()
End Sub
Private Sub MnWordWrap_Click(ByVal sender As System.Object,ByVal e As System.EventArgs) Handles MnWordWrap.Click
MnWordWrap.Checked = Not MnWordWrap.Checked
RichTextBox1.WordWrap = MnWordWrap.Checked
End Sub
Sub SetColor() '设置颜色
If ColorDialog1.ShowDialog() = DialogResult.OK Then
RichTextBox1.ForeColor = ColorDialog1.Color
End If
End Sub
Sub SetFont() '设置字体
Dim iFontSize As Integer
If FontDialog1.ShowDialog() = DialogResult.OK Then
RichTextBox1.Font = FontDialog1.Font
iFontSize = RichTextBox1.Font.SizeInPoints
'显示字体与大小
StaBar.Panels(1).Text = RichTextBox1.Font.Name & " " & iFontSize & "pt"
End If
End Sub
#End Region
10. 项目的保存与运行
代码输入完成,先将项目保存,然后按F5键或单击工具栏上的运行按钮运行该项目,项目运行后,单击下拉式菜单的各菜单项会出现如图6-17到图6-21所示的效果图。
[相关知识]
用户一定使用过Word中打开文件对话框、设置字体颜色对话框以及打印文件对话框,对于对话框一定很熟悉了。在VB.NET中,设计出象Word中打开文件对话框、设置字体颜色对话框以及打印文件对话框是一件非常轻松的事情,设计使用VB.NET的对话框基本分三步:弹出(ShowDialog方法)、判断返回值(看ShowDialog方法的返回值是什么)以及取数据(FileName属性或其它属性)。所以学会了"打开文件"的对话框的用法以后,学习其它对话框就非常容易了。
在VB.NET中对话框控件有打开文件、保存文件、颜色设置、字体设置、打印、打印预览等对话框。这些对话框控件都是不可视控件,在窗体设计器上并不直接添加到窗体上,而是放在窗体工作区的下方。
在Windows应用程序中,都需要通过文件来操作数据。要操作文件中的数据,必须先打开文件。VB.NET提供了文件打开对话框OpenFielDialog控件,程序通过调用该控件的ShowDialog方法显示如图6-18所示的打开文件对话框,用户通过指定驱动器,文件夹名称、文件名和文件扩展名。打开指定的文件后,用户就可以读写打开文件中的数据了。
文件打开对话框控件OpenFielDialog的属性如表6-11所示。
表6-11 OpenFielDialog控件的常用属性
属 性 说 明
Name 设置OpenFielDialog控件的名称
AddExtension 文件名是否包含扩展名,默认为True
CheckFileExists 如果用户选择一个不存在的文件是否显示提示信息,默认为True
CheckPathExists 如果用户选择一个不存在的路径是否显示提示信息,默认为True
DefaultExt 设置打开的默认文件名
FileName 用户在对话框的"文件名"列表框中输入的文件名会保存在该属性中。此属性的内容包含了完整的路径数据,利用此属性可以找到该文件
Filter 设置在对话框中的"文件类型"列表框中出现的文件类型列表,利用分隔号"|",一次可以设定许多种文件类型例如:要限定打开的类型为*.TXT、*.EXE和*.BAT,在Filter属性栏中应输入:Text(*.Txt)|*.TXT|EXE(*.EXE)|*.EXE|BAT(*.BAT)|*.BAT
FilterIndex 设置文件类型的索引
InitialDirectory 设置目录的起始位置
MultiSelect 设置对话框是否允许用户选取多个文件,默认为False
ReadOnlyChecked 只读复选框是否被启用,默认为False;若设置为False,则文件以只读的方式来打开
RestoreDirection 在对话框关闭之前是否存储当前的目录
ShowHelp 设置是否在对话框中显示帮助按钮
ShowReadOnly 设置是否显示只读复选框,默认为False
Title 设置对话框的标题
文件打开对话框控件OpenFielDialog的常用方法如表6-12所示。
表6-12 OpenFielDialog控件的常用方法
方 法 说 明
Dispose 释放所有被对话框打开的资源
ShowDialog 显示出对话框
OpenFileDialog控件和类,有一个StreamReader类用来读取文件。在创建了StreamReader类以后,就可以用StreamReader类的方法对文本文件进行操作了。StreamReader类的常用方法有:
1. Read方法:读取输入流中的下一个字符或下一组字符。
2. ReadToEnd方法:从流的当前位置到末尾读取流。
3. Peek方法:返回下一个可用的字符,但不使用它。
4. ReadLine方法:从当前流中取一行字符并将数据作字符串返回。
在VB.NET中,要为应用程序设置文件保存对话框,使用SaveFileDialog控件,该控件的使用和设置与OpenFileDialog控件的使用和设置基本相同,只是多了一些文件保存对话框控件SaveFileDialog的特有属性。
表6-13列出了除OpenFileDialog控件属性外,文件保存对话框控件SaveFileDialog的特有属性。
表6-13 SaveFileDialog控件的特有特性
属 性 说 明
CreatePrompt 如果该属性的值为True,则在用户指定的文件不存在时,询问用户是否建立新文件。默认该值为False,即不询问用户
OverwritePrompt 如果该属性的值为True,则在用户指定的文件已经存在时,询问用户是否重写文件。如果该值为False,则不询问用户
SaveFileDialog控件的方法与OpenFileDialog控件完全相同,可按照处理OpenFileDialog控件的方法来处理SaveFileDialog控件,例如要显示一个SaveFileDialog控件,可使用下面的代码:
SaveFileDialog1.ShowDialog()
图6-19所示为一个标题为"另存为"的文件保存对话框,该对话框的默认路径为"d:/",默认文件名为"未命名",默认文件扩展名为"*.txt"。
SaveFileDialog控件和类,有一个StreamWriter类用来写文件。在创建了StreamWriter类以后,就可以用StreamWriter类的方法对文本文件进行操作了。StreamWriter类的常用方法有:
1. Write方法:写入参数指定的字符串、数字、字符数组等。
2. Close方法:关闭当前的StreamWriter类的对象。
3. WriteLine方法:换行写入参数指定的字符串、数字、字符数组等;如果没有参数,则只能完成换行功能。
在VB.NET中,如果要进行颜色设置,可以使用颜色设置对话框控件ColorDialog。通过调用ColorDialog控件的ShowDialog方法,则可以显示"颜色"对话框如图6-20所示。这是一个标准的Windows颜色设置对话框,它支持几百万种颜色,但用户能够直接使用的颜色只有几十个,其他的颜色需要用户单击"规定自定义颜色"按钮,打开对话框的自定义部分来定义自己的颜色。
相对其他的对话框控件,ColorDialog控件的属性比较少,这时因为标准的"颜色"对话框不需要进行过多的设置。表6-14列出了颜色设置对话框控件ColorDialog的常用属性及其设置说明。
表6-14 ColorDialog控件的常用属性
属 性 说 明
Name 设置ColorDialog控件的名称
AllowFullOpen 设置对话框是否显示全部内容,包括颜色自定义部分
AnyColor 设置对话框是否显示所有可用的基本颜色
Color 设置默认颜色和接收用户选取的颜色
FullOpen 设置对话框打开时,是否显示自定义颜色,默认为False,用户必须单击"规定自定义颜色"按钮才显示。该值为True时完全展开。如果AllowFullOpen的值为False,则各个属性无效
SolidColorOnly 设置用户是否仅仅能够选择固定的颜色
ColorDialog控件只有两种方法,一个是Reset方法,用于还原对话框的默认设置,一个是ShowDialog方法,用于显示"颜色"对话框。
在VB.NET应用程序中,字体设置是通过FontDialog控件来调用一个名称为"字体"的字体设置对话框来实现的。字体设置是大部分应用程序,特别是具有文本编辑能力的应用程序的必备功能。通过调用字体对话框控件FontDialog1的ShowDialog方法,则可以显示"字体"对话框如图6-21所示。利用这个"字体"对话框,用户可以完成所有关于字体的设置。
字体对话框控件FontDialog1常用属性及设置说明如表6-15所示。
表6-15 FontDialog控件的常用属性
属 性 说 明
Color 设置字体的默认颜色
FontMustExit 设置对话框在用户试图使用不存在的字体或样式时是否指出错误情况
Font 接收用户设置的字体
MaxSize 用户选择的最大字号,默认为0,代表不限制最大字号
MinSize 用户选择的最小字号,默认为0,代表不限制最小字号
ShowApply 设置对话框是否包含"套用"按钮,默认值为False
ShowColor 设置对话框是否显示色彩选项,默认值为False
ShowEffects 设置对话框是否包含特殊效果选项,例如删除线和下划线等,默认值为False
ShowHelp 设置对话框是否显示"帮助"按钮
FontDialog控件常用的方法是ShowDialog和Reset两种,它们的使用同其他几个对话框控件相同。
前面介绍了案例6-3中所使用到的打开文件、保存文件、颜色设置、字体设置对话框,在实际应用系统中,除了经常使用前面介绍的几种通用对话框外,还经常使用VB.NET提供的"打印"和"打印预览"两个对话框。另外,还需要PrintDocument控件来真正执行打印任务。
在窗体的下方创建PrintDialog控件之后,调用该控件的ShowDialog方法即可显示"打印"对话框如图6-22所示。
图6-22 "打印"对话框
在"打印"对话框中,用户可以在打印之前设置打印的份数、选择已安装的打印机类型、设置打印范围等打印选项,操作方法和操作其他对话框一样。PrintDialog控件除了有和其他对话框相同的属性外,该控件的特有属性表6-16所示。
表6-16 PrintDialog控件的特有属性
属 性 说 明
AllowPrintToFile 设置是否激活"打印到文件"复选框
AllowSelection 设置是否激活"选择内容"单选按钮
AllowSomePages 设置是否激活"页"单选按钮
Document 设置接收打印设置的打印文档,该属性的值由PrintDocument控件来提供
PrintToFile 设置是否启用"打印到文件"复选框
ShowHelp 设置对话框是否显示"帮助"按钮
ShowNetwork 设置对话框是否显示"网络"按钮
PrinterSettings 用来接收对话框中定义的打印机设置
如果用户要在打印之前预览自己的文档,可在应用程序中添加一个PrintPreviewDialog控件,然后调用该控件的ShowDialog方法显示"打印预览"对话框(如图6-23所示)来预览打印文档。对于PrintPreviewDialog控件来说,最重要的属性就是Document属性,Document属性用来设置接收打印设备的打印文档,该属性的值由PrintDocument控件来提供。图6-23所示为一个只有一页的文档的"打印预览"对话框。
图6-23 "打印预览"对话框
实际上,文档的打印和打印预览都必须由PrintDocument控件和类来支持,它可以提供打印文档并发送打印命令到打印机,也就是说,从文档到打印机的打印任务是由Print Document类来完成的。在创建PrintDialog和PrintPreviewDialog控件之前,利用工具箱创建一个PrintDocument控件,然后设置其DocumentName属性值为要打印文档的名称和路径。
PrintDocument类也有一个PrinterSettings属性,用来接收或设置文档的打印机对象,一般从PrintDialog控件的PrinterSettings中获得。PrintDocument类通过其Print方法将文档发送到指定的打印机进行打印。在文档打印时,会为文档的每一页触发PrintPage事件,这要求用户为PrintPage事件创建一个过程和添加一个事件处理器。新建的过程可以根据StreamReader类的属性来读取文档内容并发送到打印机。
在VB.NET还提供的MsgBox函数、MessageBox类和InputBox函数可以生成标准的消息和输入对话框;VB.NET标准的消息和输入对话框的功能与VB标准的消息和输入对话框功能相似,故在本单元从略。
练习园地6
一、 基础题
1. 请写出TreeView控件nodes的主要属性。
2. 请写出ListView控件的方法。
3. 请写出Directory 类主要方法。
4. 请写出File 类的主要方法。
5. 请说出VB.NET的文件类型。
6. 请写出StreamReader类和StreamWriter类的常用方法。
7. 在VB.NET中对话框控件有打开文件、保存文件、颜色设置、字体设置、打印、打印预览等对话框VB.NET等,请说出它们有什么共同的特点?
二、 实战题
1. 完成案例6-1、案例6-2、案例6-3的操作过程。
2. 设计如图6-24所示的Windows窗体。
图6-24 Windows窗体
如下的程序代码是为了实现图6-24所示的Windows窗体上的功能,请完成上述工作。
Imports System.IO '这一行一定要加,否则无法使用文件操作的类
Public Class Form1
Inherits System.Windows.Forms.Form
#Region " Windows 窗体设计器生成的代码 "
#End Region
Private Sub Button1_Click(ByVal sender As System.Object,ByVal e As System.EventArgs) _
Handles Button1.Click
ShowFiles()
End Sub
Private Sub Form1_Activated(ByVal sender As Object,ByVal e As System.EventArgs) _
Handles MyBase.Activated
Text1.Text = Directory.GetCurrentDirectory()
ShowFiles()
End Sub
Private Sub ShowFiles()
Dim sFiles() As String
Dim i As Integer
ListBox1.Items.Clear()
If Directory.Exists(Text1.Text) Then
sFiles = Directory.GetFiles(Text1.Text)
For i = 0 To sFiles.Length - 1
ListBox1.Items.Add(Path.GetFileName(sFiles(i)).ToString)
Next
End If
TextBox1.Text = Path.GetFullPath(sFiles(0))
TextBox2.Text = Path.GetPathRoot(sFiles(0))
TextBox3.Text = Path.GetDirectoryName(sFiles(0))
TextBox4.Text = Path.GetTempPath()
End Sub
End Class
三、挑战题
在本单元案例6-1、案例6-2、案例6-3在的基础上,增加如下功能: