来自MSDN-2001-OCT: Visual Tools and Languages/Visual Studio 6.0 Documentation/Visual Basic Documentation/Using Visual Basic/Programmer’s Guide/Part 2: What Can You Do With Visual Basic/Using Visual Basic's Standard Controls
一、使用 DataCombo 和 DataList 控件
“Microsoft DataList Controls”
(1)值得注意的控件属性:BoundText、SelectedItem 、MatchEntry 、IntegralHeight、VisibleCount
(2)建议在使用 DataCombo 控件时不要设置 DataFormat 属性。因为可能会误导最终用户。
(3)DataSource、DataField、RowSource、BoundColumn、ListField
二、使用 DataGrid 控件
“Microsoft DataGrid Control”
2.1 主要用法
(1)使用 DataGrid 控件的设计时特性:检索字段、编辑、属性
(2)更改 DataSource 的RecordSource:
strQuery = "SELECT * FROM Suppliers WHERE SupplierID = 12"
Adodc1.RecordSource = strQuery
Adodc1.Refresh
(3)更改 DataSource:Set DataGrid1.DataSource = adoPubsAuthors
(4)
重新绑定 DataSource:当将 DataGrid 控件用于一个远程数据库,诸如 sqlServer 时,可以改变表的结构。例如,可以给这个表添加一个字段。在这种情形时,可以调用 Rebind 方法根据新的结构来重新创建该网格。注意,如果已经在设计时改变了这个列的布局,DataGrid 控件将会试图重新创建当前的布局,包括任何空的列。不过,通过首先调用 ClearFields 方法,可以强制该网格重新设置所有的列。
(5)从 DataGrid 返回值:在 DataGrid 被连接到一个数据库后,可能想要监视用户单击了哪一个单元。您可以使用 RowColChange 事件 — 而不是 Click 事件 — 如下所示:
(6)NumberFormat 属性不必更改实际的数据的格式就可以更改任何包含数字的列的格式。例如,给定一个网格,其中包含一个名为 ProductID 的、包含整数的列。下面的代码将使 DataGrid 以"P-0000" 的格式来显示数据。换句话说,尽管在 ProductID 字段中所包含的实际数值为 "3",但该网格所显示的值将是 "P-0003"。
DataGrid1.Columns("ProductID").NumberFormat = "P-0000"
End Sub
(7)使用 CellText 和 CellValue 方法:当一个列使用 NumberFormat 属性设置格式后,CellText 和 CellValue 属性是很有用的。要返回数据库中所包含的实际值,应使用 CellValue 方法,如下所示:
Debug.Print _
DataGrid1.Columns("ProductID").CellValue(DataGrid1.Bookmark)
End Sub
注意 上面所用的 CellValue 和下面所用的 CellText 值,都需要将 bookmark 属性作为一个参数,功能才正确。
相反地,如果要返回该字段的格式化的值,应使用 CellText 方法:
Debug.Print _
DataGrid1.Columns("ProductID").CellText(DataGrid1.Bookmark)
End Sub
注意 上面的 CellText 方法等价于使用 DataGrid 控件的 Texr 属性。
2.2 创建 OLE DB 数据链接
为想要访问的每个数据库都创建一个 OLE DB 数据源。在一个计算机上只需要创建一次 ODBC 数据源。
可以通过在“控制面板”中单击“数据链接”图标创建一个 OLE DB 数据源。在“管理数据链接文件”对话框中,单击“新建”创建一个新的数据源。
2.3 一个例子:创建一个连接 DataList 控件的 DataGrid
' 声明一个用来包含新查询的字符串变量。这个新的
' 查询使用 DataList 控件的BoundText属性
' 来提供一个 SupplierID 值。新查询查找所有
' 具有相同的 SupplierID 的产品。这个查询被
' 指定给名为 adoProducts 的 ADO Data 控件
' 的 RecordSource 属性。在刷新控件后,DataGrid
' 将使用包含由同一个公司供应的所有产品的新。
' 记录集来更新。
Dim strQuery As String
strQuery = "Select * FROM Products WHERE SupplierID = " & _
Datalist1.BoundText
With adoProducts
.RecordSource = strQuery
.Refresh
End With
With DataGrid1
.ClearFields
.ReBind
End With
End Sub
2.4 使用列
' 在最右边的位置添加一列。然后设置其 Visible、Width、
' Caption、以及 Alignment 属性。DataField 属性则指定
' 该列将绑定到哪一个字段。
Dim c As Column
Set c = DataGrid1.Columns.Add(DataGrid1.Columns.Count)
With c
.Visible = True
.Width = 1000
.Caption = "我的新列"
.DataField = Adodc1.Recordset.Fields("ProductName").Name
.Alignment = dbgRight
End With
End Sub
Private Sub DataGrid1_HeadClick(ByVal ColIndex As Integer)
DataGrid1.Columns.Remove ColIndex
End Sub
(2)隐藏列
' 使用 DataField 属性来判别正在测试的是哪一列。
' 只显示三列:ProductName、UnitPrice、以及
' UnitsInStock。
Dim c As Column
For Each c In DataGrid1.Columns
Select Case c.DataField
Case "ProductName"
c.Visible = True
Case "UnitPrice"
c.Visible = True
Case "UnitsInStock"
c.Visible = True
c.Caption = "In Stock" ' 更改这个列的标头。
Case Else ' 隐藏其它所有的列。
c.Visible = False
End Select
Next c
End Sub
2.5 操作 DataGrid 视图
(1)创建一个 Split 对象:在设计时,可以创建一个拆分,具体步骤是:右键单击网格,单击“编辑”,再单击右键,然后单击“拆分”。通过右键单击该控件,并单击“属性”来显示“属性页”对话框,可以编辑这个拆分。可以使用“拆分”选项卡来自定义拆分。要删除一个拆分,右键单击该拆分,并单击“删除”。
(2)在运行时,最终用户也可以通过单击位于这个网格控件的左下边的右边的选项卡,以手工方式来拆分该网格
(3)默认情况下,DataGrid 控件包含一个 Split 对象。防止最终用户添加拆分的代码为:DataGrid1.Splits(0).AllowSizing = False
(4)DataGrid 控件包含一个 Split 对象的集合。要在程序中添加拆分,可以使用 Add 方法,如下所示:
DataGrid1.Splits.Add DataGrid1.Splits.Count
End If
(5)使拆分同步:要同步任何两个(或多个)拆分,只需将每个 Split 对象的 ScrollGroup 属性设置为同一个值。通过设置 Scrollbars 属性,使同步的拆分组只显示一个滚卷条,从而进一步自定义拆分的外观。
.Splits(0).ScrollGroup = 1
.Splits(1).ScrollGroup = 2
.Splits(2).ScrollGroup = 1
End With
(6)使用 WrapCellPointer、TabAcrossSplits、以及 TabAction 属性,可以决定当最终用户按下 tab 键或箭头键时网格的行为。在这三个属性中,TabAction 属性级别最高,它决定 WrapCellPointer 和 TabAcrossSplits 这两个属性是否能生效。
(7)每一个 Split 对象都有一个 Columns 属性,允许用户来操作一个 Column 对象的集合。通过这样做,可以更改每个 Split 对象的外观。
2.6 使用 Bookmarks 和 SelBookmarks 跟踪记录
SelBookmarks 集合包含所有选定的记录的书签。当最终用户手工选择记录时(即在单击时按住 CTRL 键),每一个选定的记录的书签都会加入到该集合。
通过将记录添加到这个集合,也可以在程序中选定记录。
Set rs = Adodc1.Recordset
While Not rs.EOF
If rs!SupplierID = 12 Then
DataGrid1.SelBookmarks.Add rs.Bookmark
End If
rs.MoveNext
Wend
2.7 显示计算结果字段
设置 ADO Data 控件的 RecordSource 属性。 在“属性”窗口中,单击“记录源”并输入 Select ProductName,UnitPrice,(UnitPrice * .082) As Tax From Products。
2.8 与类模块一起使用 DataGrid 控件
(1)如果想要访问以自定义格式或以 ODBC 驱动程序不直接支持的格式存放的数据,可以创建一个类来封装该数据。然后可以编写该类的自定义函数来检索这些数据。这样该类就变成了一种数据源,可以被任何数据使用者(如 DataGrid 控件)使用。
(2)在这个类模块的Initialize 事件中,首先通过声明一个作为 New ADODB.Recordset的变量,来创建一个 ADODB recordset 对象。在创建了这个 recordset 对象后,再添加字段,每个数据源中的每个字段都要加入。然后使用合适的数据填充这个记录集。
注意 也可以使用 OLEDB 示例提供者来创建一个数据源。关于 OLEDB 示例提供者的详细信息,请参阅“创建带有数据提供方的部件”。
类模块有一个 GetDataMember 事件,只要当数据使用者(诸如 DataGrid 控件)需要数据时就产生该事件。在这个事件中,Data 参数被设置为在 Initialize 事件中所创建的 recordset 对象。
(3)如果要使用这个类模块,应创建一个具有一个 DataGrid 控件的窗体。在该窗体的 Load 事件的代码中,将该控件的 DataSource 属性设置为这个类。
注意 数据类模块在设计时是不可用的。例如,如果使用 DataGrid 控件,则当用户在“属性”窗口中单击“数据源”时,所有可用的数据源都会出现在一个下拉列表中。但其中不会有这个数据类模块,它只能在代码中设置。
(4)使用类模块创建一个数据源:在类模块“属性”窗口中,单击“DataBehavior”并将该属性更改为vbDataSource。
(5)使用DataMember:在Class_Initialize里添加DataMember;在GetDataMember里根据不同的DataMember返回不同的结果集;在Form_Load设置想要的DataMember。
' 将新的数据成员的名称添加到 DataMember 集合
' 这使其它对象可以看见这些可用的 DataMembers
DataMembers.Add "Names"
Set rsNames = New ADODB.RecordSet ' 设置对象变量。
……
End Sub
Private Sub Class_GetDataMember(ByVal DataMember As String, Data As _
Object)
Select Case DataMember
Case "Names"
Set Data = rsNames
Case "Dates"
Set Data = rsDates
Case Else
' 设置一个默认的数据成员
Set Data = rsYears
End Select
End Sub
Private Sub Form_Load()
' 创建一个新的 NamesData 对象
Set datNames = New NamesData
' 指定所需的 DataMember,然后设置 DataSource。
DataGrid1.DataMember = "Names"
Set DataGrid1.DataSource = datNames
End Sub
三、使用文件系统控件(Directory List Box、Drive List Box 和 File List Box)
文件系统控件使操作非常灵活,这是 CommonDialog 控件无法做到的。可以用多种方法混合、匹配它们,并可控制它们的外观和交互方式。
如果目的就是要让用户能够打开和保存文件,则 CommonDialog 控件为这些操作提供了现成的一组对话框
驱动器列表框:指定出现在列表框顶端的驱动器:
Drive1.Drive = "c:/";变更当前的工作驱动器
:ChDrive Drive1.Drive;
3.1 目录列表框
(1)
标识单个目录:列表框中的每个目录关联一个整型标识符,可用它来标识单个目录。 CommonDialog 控件没有提供这个功能。Path 属性 (Dir1.Path
) 指定的目录总是有 ListIndex 值 –1。紧邻其上的目录具有 ListIndex 值— 2,再上一个为 ListIndex— 3,依次类推。Dir1.Path
的第一个子目录具有 ListIndex 值 0。如图 7.21 所示,若第一级子目录有多个目录,则每个目录的 ListIndex 值按 1、2、3……的顺序依次排列。
(2)设置当前目录:可用目录列表框的 Path 属性设置或返回列表框中的当前目录 (ListIndex = – 1)。目录列表框并不在操作系统级设置当前目录;它只是突出显示目录并将其 ListIndex 值设置为 – 1。
(3)在使用文件控件的应用程序中,可用 Application 对象将当前目录设置成应用程序的可执行 (.exe) 文件所在目录:
ChDir App.Path '设置目录。
注意 Path 属性只在运行时可用,在设计时不可用。
(4)单击目录项目:单击目录列表框中的某个项目时将突出显示该项目。而双击项目时则把它赋予 Path 属性并把其 ListIndex 属性设置为— 1,然后重绘目录列表框以显示直接相邻的下级子目录。
(5)查找目录的相对位置:ListCount 属性返回当前扩展目录下的目录数目,而不是目录列表框中的目录总数。因为当前扩展目录的 ListIndex 值总为 – 1,所以可以编程来判断在目录层次结构中,当前扩展目录与根目录有多大距离。例如:
GoHigher = 0
'若目录不存在,
'则 Dir1.List(x) 返回空字符串。
Do Until Dir1.List(GoHigher) = ""
GoHigher = GoHigher - 1
Loop
'如有必要可转换成正数。
LevelsAbove = Abs(GoHigher)
3.2 文件列表框
(1)文件列表框在运行时显示由 Path 属性指定的包含在目录中的文件。可用下列语句在当前驱动器上显示当前目录中的所有文件:File1.Path = Dir1.Path
(2)然后,可设置 Pattern 属性来显示这些文件的子集─ 例如,设置为 *.frm 后将只显示这种扩展名的文件。Pattern 属性也接受由分号分隔的列表。例如,下列代码行将显示所有扩展名为 .frm 和 .bas 的文件:File1.Pattern = "*.frm; *.bas"
(3)Visual Basic 支持 ? 通配符。例如,???.txt 将显示所有文件名包含三个字符且扩展名为 .txt 的文件。
(4)文件列表框的属性也提供当前选定文件的属性(Archive、Normal、System、Hidden 和 ReadOnly)。可在文件列表框中用这些属性指定要显示的文件类型。System 和 Hidden 属性的缺省值为 False。Normal、Archive 和 ReadOnly 属性的缺省值为 True。
(5)缺省时,在文件列表框中只突出显示单个选定文件项。要选定多个文件,应使用 MultiSelect 属性。
3.3 使用文件系统控件的组合
如果使用文件系统控件的组合,则可同步显示信息。例如,若有缺省名为 Drive1、Dir1 和 File1 的驱动器列表框、目录列表框和文件列表框:
Dir1.Path = Drive1.Drive
End Sub
Private Sub Dir1_Change ()
File1.Path = Dir1.Path
End Sub
四、使用 Frame 控件
(1)在使用框架控件分组其他选项的时候,请首先绘出框架控件,然后再绘制它内部的其他控件。这样在移动框架的时候,可以同时移动它包含的控件。
(2)要将控件加入到框架中,只需将它们绘制在框架的内部即可。如果将控件绘制在框架之外,或者在向窗体添加控件的时候使用了双击方法,然后将它移动到框架控件内部,那么控件将仅仅“位于”框架的顶部,在进行移动的时候将不得不分别移动框架和控件。
(3)注意 如果希望将已经存在的若干控件放在某个框架中,可以先选择所有控件,将它们剪贴到剪贴板上,然后选定框架控件并把它们粘贴到框架上。
(4)要选择框架中的多个控件,在使用鼠标拉框包围控件的时候需要按下 CTRL 键。在释放鼠标的时候,位于框架之内的控件将被选定。