
巧用VB6的DataGrid实现通用电子表格.docx
8页巧用 VB6的 DataGrid实现通用电子表格 ..............................................................................2VB控件数组的操作技巧 ..........................................................................................................5巧用 VB6的 DataGrid实现通用电子表格在 Microsoft Developer Network Library Visual Studio 6.0(MSDN)或者VB5.0的《联 机手册》中都提供了一个《在(Hierarchical)FlexGrid 电子表格中编辑单元》的解决方 案,实现了在(Hierarchical)FlexGrid 电子表格中编辑单元,另外也有一些关于实现类 电 子表格的文章与该方案大同小异,都是用 TextBox与 Grid 一类的控件配合来实现的,因 为 Grid 之类的控件本身是不可以编辑单元的,然而众所周知 DataGrid本身就是可以编 辑单元,它的一般用法是在程序设计或运行时设置一个数据源(DataSource) ,这个数据 源可以是 Recordset或者是数据控件(如:ADODC 等) ,在通常情况下该数据源是一个 数据库(DataBase)的基本表(Table) 、视图(View)或者查询(Query)等。
其实,DataGrid 的数据源的本质就是一个二维表,该数据源可以是一个无数据库实体的二维表(记录集 Recordset) ,这样就可以用DataGrid实现通用电子表格编辑单元思路很简单,就是在 程序运行时,创建一任意 Recordset作为 DataGrid的 DataSource当然,该记录集仅仅 就是一个二维表,并无数据库实体 一些实现的技术细节代码如下: 创建任意无数据库实体的记录集,并将其设为 DataGrid的数据源 Dim adoRecordset As ADODB.Recordset Set adoRecordset = New ADODB.Recordset Dim i As Integer For i = 0 To 2 '为 Recordset三个字段,即为 DataGrid 添加三列 adoRecordset.Fields.Append "第" & i & "列", adVariant, , adFldMayBeNull + adFldIsNullable + adFldUpdatable Next i adoRecordset.Open For i = 0 To 3 adoRecordset.AddNew '加四条记录,即为 DataGrid 添加四空行 Next i Set DataGrid1.DataSource = adoRecordset '绑定 DataGrid 的数据源 adoRecordset.MoveFirst '编到这里就已经实现 了编辑单元格。
? 准确读取单元格内容,是电子表格最重要的方面 方法一:直接使用记录集 创建如下函数返回某单元格内容: Private Function vMyCell_1 (adoRecordsetX As ADODB.Recordset, iColX As Integer, iRowX As Integer) As Variant If iColX Command1.Count - 1 Then comNum = 0Command1(comNum).Enabled = True '让所有按钮可用NextCommand1(Index).Enabled = False '让被单击按钮不可用End Sub二、运行中添加和卸载数组控件窗体上已有一个文本框 Text1,程序需要在运行时动态地创建若干文本框,可这样实现:1.首先,设计时给 Text1的 Index属性设置为"0",这一步很重要:有了索引号才能创建数组控件;2.编写代码:[之前请给工程添加两个命令按钮,Name 属性取缺省值,Caption属性分别为:添加、卸载]Private Sub Command1_Click()Dim txtNum As Integer 'Text1的 Index号Dim Num As Integer '赋给各 TextBox的值txtNum = 0 '初值Num = 1 '初值Text1(0).Text = "Text" & Num '第一个 Text1的值Dim i As Integer '计数器For i = 0 To 4 '添加五个 TextBoxtxtNum = txtNum + 1Num = Num + 1Load Text1(txtNum) '加载文本框Text1(txtNum).Top = Text1(txtNum - 1).Top + 450 '设置位置Text1(txtNum).Text = "Text" & Num '加载内容Text1(txtNum).Visible = True '令其可见:不能漏NextCommand1.Enabled = False Command2.Enabled = TrueEnd SubPrivate Sub Command2_Click()Dim i As Integer, N As IntegerN = 0For i = 1 To Text1.Count - 1N = N + 1Unload Text1(N)NextCommand1.Enabled = TrueCommand2.Enabled = FalseEnd Sub三、给运行中添加的数组控件命名并编写事件其实例二已经给数组控件命了名,只是简单了些。
本例将文件夹"F:\Txt"下的所有.txt 的文件名作为菜单的 Caption添加到菜单项里[请事先建立此文件夹并拷贝一些.txt 文件,或者更改代码],当点击这些菜单,程序将调出 Windows的记事本打开相应的文件键入以下代码前请启动 VB的菜单编辑器,建立一个父菜单项[Naem 和 Caption属性任意],然后在此父菜单下建立一个子菜单,Name 属性为"mnuFiles",Caption属性为"没有文件"Dim MyPath As String '路径名变量'添加并命名菜单过程Private Sub AddMenu()Dim MenuNum As Integer '菜单索引号变量Dim MyFiles As String '文件名变量MenuNum = 0 '初值MyFiles = Dir(MyPath + "*.txt") '仅查找文本文档If MyFiles = "" Then Exit Sub '为空则退出过程mnuFiles(0).Caption = MyFiles '给第一个菜单命名Do Until MyFiles = ""MyFiles = Dir()If MenuNum = 0 Then MenuNum = 1MenuNum = MenuNum + 1Load mnuFiles(MenuNum) '加载菜单mnuFiles(MenuNum).Visible = True '设置为可见:不能漏mnuFiles(MenuNum).Caption = MyFilesIf mnuFiles(MenuNum).Caption = "" Then Unload mnuFiles(MenuNum)'若菜单名为空则卸载掉LoopEnd SubPrivate Sub Form_Load()MyPath = "F:\Txt\" '规定路径Call AddMenu '执行添加菜单过程End SubPrivate Sub mnuFiles_Click(Index As Integer)Dim ret As String'用 Windows的记事本打开文件:注意中间的空格不能少ret = "Notepad.exe" & " " & MyPath & mnuFiles(Index).CaptionShell ret, vbNormalFocusEnd Sub四、控件在窗体上的排列问题曾有一位网友两次问土人怎样才能在窗体上添加 100万个文本框。
呵呵,这要多大的显示器才能显示出来呀!不过,添加的数组控件多了,排列确实是个问题下面的例子给窗体添加 499个 Label控件,连同事先绘制好的 Index号定义为 0的控件,总共有 500个,能在窗体上从左到右、从上到下整齐地排列程序运行时要花些许时间Option ExplicitPrivate Sub Form_Load()Me.Width = 6800Me.Height = 6000Me.Caption = "添加标签演示"With Label1(0).Top = 0.Left = 120.Height = 200.Width = 300.Caption = ""End WithAddLabelsEnd SubPrivate Sub AddLabels()Dim i As Integer '计数器Dim Num As Integer 'Label的 Index号Dim k As Integer '判断是否满行Dim n As Integer '行数计数器Num = 0k = 0n = 0Label1(0).Caption = Num + 1For i = 1 To 499Num = Num + 1Load Label1(Num) '加载 Label控件Select Case k Case 0Label1(Num).Left = Label1(Num - 1).Left + Label1(0).Width + 20If Num = 20 Then n = n + 1: k = nCase nLabel1(n * 20).Left = 120Label1(n * 20).Top = Label1(0).Height * nLabel1(Num).Top = Label1(0).Height * nLabel1(Num).Left = Label1(Num - 1).Left + Label1(0).Width + 20If Num = (n + 1) * 20 Then n = n + 1: k = nEnd Select Label1(Num).Caption = Num + 1Label1(Num).Visible = TrueNextEnd Sub。
