[VB.NET]单元六 文件与资源管理

单元六 文件与资源管理

[学习目标] 本单元主要介绍用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所示

RichTextBox Name RichTextBox1

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-2 案例6-1窗体设计及各控件属性设置后的效果图

图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"

'此部分代码见第5个步骤的代码

#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集合属性

表6-2 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)。

(4)CheckBoxes 属性

TreeView 控件的 CheckBoxes 属性的功能可以决定是否在节点旁显示复选框;当该属性设置为 True,则在显示树视图时,节点旁边带有复选框,此时,用户可以通过单击鼠标选中或取消节点旁的复选框以决定节点是显示或清除;当然用户也可以通过编程的方式在程序中将节点的 Checked 属性设置为 true 或 false以决定节点是显示或清除。

(5)Indent属性

Indent属性用来设置父节点与子节点之间的水平缩进距离。

(6)LabelEdit属性

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所示。

图6-11 ListView控件的View属性设置方法

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属性

FocusedItem属性返回当前获取焦点的列表项。

(11)Columns集合属性

Columns集合属性是用来设置ListView控件的列表头,只有当ListView控件的View属性设置为Details才会显示ListView控件的列表头。用户可以通过单击属性窗口中Columns属性右边的 按钮,通过图6-8和图6-9所示的"ColumnsHeader集合编辑器"向ListView控件中添加列表头。

Columns集合属性主要是设置列表项的属性,列表头项的常用属性如表6-3所示。

表6-3 列表头项的常用属性

属性名 属性说明

text 属性 用来设置列表头显示的文本

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命名空间提供以下功能:

1. 创建、删除和操作文件夹及文件。

2. 对文件夹及文件进行监视。

3. 从流中读写数据或字符(包括多字节字符,并可以直接读写各种数据类型)。

4. 随机访问文件。

5. 使用多种枚举常量设置文件夹和文件的操作等。

在使用与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-14 选择删除文件菜单出现的消息框

图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设置弹出式菜单各菜单项的属性。

表6-6弹出式菜单各菜单项的属性

控件名 属性名 设置值

弹出式菜单ContextMenu1 Name Mnucopy

Text 文件复制

Name Mnupaste

Text 文件粘贴

Name Mnudelete

Text 文件删除

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

7. 为上下文菜单编写各菜单项的Click事件代码如下:

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 & " 这个文件吗?",_

MsgBoxStyle.YesNo,"文件删除提示")

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 编码文本附加到现有文件。

Copy 将现有文件复制到新文件。

Create 以指定的完全限定路径创建文件。

CreateText 创建或打开一个新文件,用于编写 UTF-8 编码文本。

Delete 删除指定文件。

Exists 返回 Boolean 值,表明指定文件是否存在。

GetAttributes 返回完全限定路径的文件的 FileAttributes。

GetCreationTime 返回 Date,表示指定文件的创建时间。

GetLastAccessTime 返回 Date,表示最近一次访问指定文件的时间。

GetLastWriteTime 返回 Date,表示最近一次写入指定文件的时间。

Move 将指定文件移到新位置,提供选项以指定新的文件名。

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所示):

表6-9 StreamWriter类写入流或文件的常用方法

方法名 方法说明及举例

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设置下拉式菜单各菜单项的属性。

表6-10 下拉式菜单各菜单项的属性

控件名 属性名 设置值

下拉式菜单MainMenu1一级菜单 Name MenuFile

Text 文件(&F)

Name MenuEdit

Text 编辑(&E)

Name MnFormat

Text 格式

一级菜单"文件"下的二级菜单 Name MnOpenNew

Text 新建(&N)

Name MnOpenOld

Text 打开(&O)

Name MnSave

Text 保存(&S)

Name MenuItem1

Text -

Name MnEnd

Text 结束(&X)

一级菜单"编辑"下的二级菜单 Name MnUndo

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控件中显示案例的功能及操作方法

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

bModify = True '设定文件已经修改了

' *表示文件目前被修改了但是尚未保存

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) '将文件输出

FileClose(fnum) '关闭文件

bModify = False '文件没有被修改

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,"保存提示")

'调用 SaveTextToFile() 保存文件

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 释放所有被对话框打开的资源

OpenFile 以只读的方式打开用户选择的文件

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 窗体设计器生成的代码 "

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在的基础上,增加如下功能:

1. 当在窗体左窗格中右击鼠标时,弹出4个菜单,分别是"新建文件夹"、"复制文件夹"、"粘贴文件夹"、"删除文件夹"。

2. 为4个菜单编写相应的Click事件代码,要求:文件夹的变化情况应能在TreeView控件的节点中反映出来。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Format[$] ( expr [ , fmt ] ) format 返回变体型 format$ 强制返回为文本 -------------------------------- 数字类型的格式化 --------------------------------     固定格式参数:     General Number 普通数字,如可以用来去掉千位分隔号     format$("100,1
VB6或者ASP 格式化时间为 MM/dd/yyyy 格式,竟然没有好的办法, Format 或者FormatDateTime 竟然结果和系统设置的区域语言的日期和时间格式相关。意思是尽管你用诸如 Format(Now, "MM/dd/yyyy"),如果系统的设置格式区域语言的日期和时间格式分隔符是"-",那他还会显示为 MM-dd-yyyy     只有拼凑: <%response.write
在项目中添加如下代码:新建窗口来显示异常信息。 Namespace My ‘全局错误处理,新的解决方案直接添加本ApplicationEvents.vb 到工程即可 ‘添加后还需要一个From用来显示错误。如果到这步还不会则需要先打好基础啦 ‘======================================================== ‘以下事件
转了这一篇文章,原来一直想用C#做k3的插件开发,vb没有C#用的爽呀,这篇文章写与2011年,看来我以前没有认真去找这个方法呀。 https://blog.csdn.net/chzjxgd/article/details/6176325 金蝶K3 BOS的插件官方是用VB6编写的,如果  能用.Net下的语言工具开发BOS插件是一件很愉快的事情,其中缘由不言而喻,而本文则是个人首创,实现在了用V
Sub 分列() ‘以空格为分隔符,连续空格只算1个。对所选中的单元格进行处理 Dim m As Range, tmpStr As String, s As String Dim x As Integer, y As Integer, subStr As String If MsgBox("确定要分列处理吗?请确定分列的数据会覆盖它后面的单元格!", _
  窗体代码 1 Private Sub Text1_OLEDragDrop(Data As DataObject, Effect As Long, Button As Integer, Shift As Integer, X As Single, Y As Single) 2 Dim path As String, hash As String 3 For Each fil
  Imports MySql.Data.MySqlClient Public Class Form1 ‘ GLOBAL DECLARATIONS Dim conString As String = "Server=localhost;Database=net2;Uid=root;Pwd=123456;" Dim con As New MySqlConnection
‘導入命名空間 Imports ADODB Imports Microsoft.Office.Interop   Private Sub A1() Dim Sql As String Dim Cnn As New ADODB.Connection Dim Rs As New ADODB.Recordset Dim S As String   S = "Provider=OraOLEDB.Oracl
Imports System.IO Imports System.Threading Imports System.Diagnostics Public Class Form1 Dim A(254) As String    Function ping(ByVal IP As Integer) As String Dim IPAddress As String IPAddress = "10.0.
VB运行EXE程序,并等待其运行结束 参考:https://blog.csdn.net/useway/article/details/5494084 Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long Pr
今天碰到一个问题,登陆的时候,如果不需要验证手机号为空,则不去验证手机号 因为登陆的时候所有的验证信息都存放在一个数组里 Dim CheckUserInfo() As String ={UserBirthday, SecEmail, UserMob, UserSex, RealNameFirst, RealName, CheckCardID, CheckCardType, Contactemail
在VB6.0中,数据访问接口有三种: 1、ActiveX数据对象(ADO) 2、远程数据对象(RDO) 3、数据访问对象(DAO) 1.使用ADO(ActiveX Data Objec,ActiveX数据对象)连接SQL Server 1)使用ADO控件连接 使用ADO控件的ConnectionString属性就可以连接SQL Server,该属性包含一个由分号分隔的argument=value语
注:大家如果没有VB6.0的安装文件,可自行百度一下下载,一般文件大小在200M左右的均为完整版的软件,可以使用。   特别提示:安装此软件的时候最好退出360杀毒软件(包括360安全卫士,电脑管家等,如果电脑上有这些软件的话),因为现如今的360杀毒软件直接会对VB6.0软件误报,这样的话就可能会在安装过程中被误报阻止而导致安装失败,或者是安装后缺乏很多必须的组件(其它的杀毒软件或安全卫士之类的
Private Sub Form_Load() Call conndb End Sub Private Function conndb() Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset Dim strCn, sql As String Dim db_host As String Dim db_user As String
  PPSM06S70:  Add  moddate  EDITSPRINTJOB:  MAX(TO_CHAR(ETRN.MODDATE, ‘yyyy/mm/dd/HH24:MI AM‘)) ACTUAL_SHIPDATE   4.Test Scenario (1) :Query SQL Test DN:8016578337 SELECT CTRN.TKCTID TRUCK_ID,        
  沒有出現CrystalReportViewer時,須安裝CRforVS_13_0. 新增1個數據集,新增1個數據表,添加二列,列名要和資料庫名一樣. 修改目標Framework 修改app.config, <startup >改成<startup useLegacyV2RuntimeActivationPolicy ="true">  CrystalReport1.rpt增加數據庫專家 在表單
Imports System.Threading Imports System Public Class Form1 Dim th1, th2 As Thread Public Sub Method1() Dim i As Integer For i = 1 To 100 If Me.Label1.BackColor =
Friend Const PROCESS_ALL_ACCESS = &H1F0FFF = 2035711 Friend Const PROCESS_VM_READ = &H10 Friend Const PROCESS_VM_WRITE = &H20 Friend Const PAGE_READONLY = &H2 Friend Const PAGE_READWRITE = &H4 Friend
以下代码随手写的 并没有大量测试 效率也有待提升 如果需要C#的请自行转换 Function SplitBytes(Data As Byte(), Delimiter As Byte()) As List(Of Byte()) Dim i = 0 Dim List As New List(Of Byte()) Dim bytes As New
Imports System.Data.SqlClient Public Class Form1 REM Public conn1 As SqlConnection = New SqlConnection("server=.; Integrated Security=False;Initial Catalog= mydatabase1; User ID= sa;password")