打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
通用的报表式数据录入

 

实际应用问题:
报表数据录入界面设计是交互式应用程序最基本的一个步骤。在visual basic 6环境下,这种界面的设计更是方便而且快捷,通常的做法是为每一个录入模块设计一个form,在其中放入众多的lable控件和textbox控件,label控件用于提示输入的报表栏目名称,textbox控件用于接收实际的数据录入。
本文尝试实现一种通用的报表式数据录入方式,目的是:1、报表栏目名称不是在程序设计阶段决定,而是在程序运行阶段从预先存储的文件或数据库表中取得;2、对应于第1点报表栏目的运行时动态决定,相应的数据录入的条目也应该是变化的,设想使用类似excel的输入方式,但是提供一些更灵活的控制方式。

实现步骤以及原理:
首先实现第二步,使用一个msflexgrid控件和一个textbox控件,再加上对这两个控件的一些不太常用的事件进行编程,就可以较好的实现这一步。Msflexgird控件应该是有两栏,左栏是报表的栏目名称,右栏是录入的数据,但是数据并不是直接录入在右栏,而是录入在textbox中,所以要解决是如何将textbox正好嵌入到右栏的某个网格中,而且按下回车或光标控制键切换到另一栏进行输入后,如何使msflexgrid反映textbox中输入的数据,并且textbox显示当前栏目的数据用以修改或录入,同时要支持回车键、光标键以及鼠标直接点击到某个栏目的网格中进行录入。
实际程序运行时的控件的显示(黄色的方框表示嵌入到msflexgrid的textbox控件):
 
假设textbox的实例名为text1,msflexgrid的实例名为msflexgrid1;
代码如下:
Private Sub Text1_KeyDown(KeyCode As Integer, Shift As Integer)
Select Case KeyCode
Case 38  ' 光 标 向 上
If t04 < 11 Then
  If MSFlexGrid1.Row > 1 Then
  MSFlexGrid1.Row = MSFlexGrid1.Row - 1
  Else
  MSFlexGrid1.Row = t04
  End If
Else
If MSFlexGrid1.Row > MSFlexGrid1.TopRow Then
MSFlexGrid1.Row = MSFlexGrid1.Row - 1
ElseIf MSFlexGrid1.Row = MSFlexGrid1.TopRow And MSFlexGrid1.Row <> 1 Then
MSFlexGrid1.Row = MSFlexGrid1.Row - 1
MSFlexGrid1.TopRow = MSFlexGrid1.TopRow - 1
Else
MSFlexGrid1.Row = t04
rownum = 10
colnum = 1 '防止最后一行回车后,跳转到第十行,而应该跳到第一行
MSFlexGrid1.TopRow = t04
End If
End If
colnum = MSFlexGrid1.Col - MSFlexGrid1.LeftCol + 1
rownum = MSFlexGrid1.Row - MSFlexGrid1.TopRow + 1
Text1.Text = MSFlexGrid1.Text
Text1.Left = MSFlexGrid1.Left + (MSFlexGrid1.ColWidth(0) _
          + MSFlexGrid1.GridLineWidth * 12) * colnum
Text1.Top = MSFlexGrid1.Top + (MSFlexGrid1.RowHeight(0) _
          + MSFlexGrid1.GridLineWidth * 12) * rownum

Exit Sub

Case 40  ' 光 标 向 下
If t04 < 11 Then
  If MSFlexGrid1.Row < t04 Then
  MSFlexGrid1.Row = MSFlexGrid1.Row + 1
  Else
  MSFlexGrid1.Row = 1
  End If
Else
If MSFlexGrid1.Row < MSFlexGrid1.TopRow + 10 - 1 Then
MSFlexGrid1.Row = MSFlexGrid1.Row + 1
ElseIf MSFlexGrid1.Row <> t04 And MSFlexGrid1.Row = MSFlexGrid1.TopRow + 10 - 1 Then
MSFlexGrid1.Row = MSFlexGrid1.Row + 1
MSFlexGrid1.TopRow = MSFlexGrid1.TopRow + 1
Else
MSFlexGrid1.Row = 1
rownum = 1
colnum = 1 '防止最后一行回车后,跳转到第十行,而应该跳到第一行
MSFlexGrid1.TopRow = 1
End If
End If
colnum = MSFlexGrid1.Col - MSFlexGrid1.LeftCol + 1
rownum = MSFlexGrid1.Row - MSFlexGrid1.TopRow + 1
Text1.Text = MSFlexGrid1.Text
Text1.Left = MSFlexGrid1.Left + (MSFlexGrid1.ColWidth(0) _
             + MSFlexGrid1.GridLineWidth * 12) * colnum
Text1.Top = MSFlexGrid1.Top + (MSFlexGrid1.RowHeight(0) _
             + MSFlexGrid1.GridLineWidth * 12) * rownum
Exit Sub
Case 13  ' 回 车
If t04 < 11 Then
  If MSFlexGrid1.Row < t04 Then
  MSFlexGrid1.Row = MSFlexGrid1.Row + 1
  Else
  MSFlexGrid1.Row = 1
  End If
Else
If MSFlexGrid1.Row < MSFlexGrid1.TopRow + 10 - 1 Then
MSFlexGrid1.Row = MSFlexGrid1.Row + 1
ElseIf MSFlexGrid1.Row <> t04 And MSFlexGrid1.Row = MSFlexGrid1.TopRow + 10 - 1 Then
MSFlexGrid1.Row = MSFlexGrid1.Row + 1
MSFlexGrid1.TopRow = MSFlexGrid1.TopRow + 1
Else
MSFlexGrid1.Row = 1
rownum = 1
colnum = 1 '防止最后一行回车后,跳转到第十行,而应该跳到第一行
MSFlexGrid1.TopRow = 1
End If
End If
colnum = MSFlexGrid1.Col - MSFlexGrid1.LeftCol + 1
rownum = MSFlexGrid1.Row - MSFlexGrid1.TopRow + 1
Text1.Text = MSFlexGrid1.Text
Text1.Left = MSFlexGrid1.Left + (MSFlexGrid1.ColWidth(0) _
            + MSFlexGrid1.GridLineWidth * 12) * colnum
Text1.Top = MSFlexGrid1.Top + (MSFlexGrid1.RowHeight(0) _
           + MSFlexGrid1.GridLineWidth * 12) * rownum
Exit Sub
End Select
End Sub

Private Sub Text1_Change()
MSFlexGrid1.Text = Text1.Text
End Sub

Private Sub MSFlexGrid1_Scroll()
MSFlexGrid1.Row = MSFlexGrid1.TopRow + rownum - 1
Text1.Left = MSFlexGrid1.Left + (MSFlexGrid1.ColWidth(0) _
          + MSFlexGrid1.GridLineWidth * 12) * colnum
Text1.Top = MSFlexGrid1.Top + (MSFlexGrid1.RowHeight(0) _
          + MSFlexGrid1.GridLineWidth * 12) * rownum
Text1.Text = MSFlexGrid1.Text
End Sub
Private Sub MSFlexGrid1_MouseUp(Button As Integer, Shift As Integer, X As Single, y As Single)
Text1.SetFocus
End Sub
Private Sub MSFlexGrid1_MouseDown(Button As Integer, Shift As Integer, X As Single, y As Single)
MSFlexGrid1.Col = MSFlexGrid1.ColSel
MSFlexGrid1.Row = MSFlexGrid1.RowSel
Text1.Text = MSFlexGrid1.Text
colnum = MSFlexGrid1.Col - MSFlexGrid1.LeftCol + 1
rownum = MSFlexGrid1.Row - MSFlexGrid1.TopRow + 1
Text1.Left = MSFlexGrid1.Left + (MSFlexGrid1.ColWidth(0) _
         + MSFlexGrid1.GridLineWidth * 12) * colnum
Text1.Top = MSFlexGrid1.Top + (MSFlexGrid1.RowHeight(0) _
         + MSFlexGrid1.GridLineWidth * 12) * rownum
End Sub
这些代码一是实现了textbox的定位,以使它与msflexgrid融合;二是处理了回车键(表示一栏输入完毕回车切换到下一栏的录入),支持了上下光标键(切换到上或下个栏目),支持了鼠标直接点击某个栏目进行输入,同时也考虑了对msflexgrid进行scroll操作时会出现的问题。
需要注意的是在form_load中还需要进行一些初始化设置:
MSFlexGrid1.ColWidth(0) = 2000
MSFlexGrid1.RowHeight(0) = 216
'文本框的宽、高度
Text1.Width = MSFlexGrid1.ColWidth(1)
Text1.Height = MSFlexGrid1.RowHeight(1)
'文本框的位置
Text1.Left = MSFlexGrid1.Left + MSFlexGrid1.ColWidth(0) _
           + MSFlexGrid1.GridLineWidth * 12
Text1.Top = MSFlexGrid1.Top + MSFlexGrid1.RowHeight(0) _
           + MSFlexGrid1.GridLineWidth * 12
MSFlexGrid1.Cols = 2
MSFlexGrid1.Rows = 20 '表中总的列、行数
MSFlexGrid1.Col = 1
MSFlexGrid1.Row = 1  ' 网格的列、行初始位置
MSFlexGrid1.LeftCol = 1
MSFlexGrid1.TopRow = 1   '网格中左上角的列、行初始位置

**************************************************
第二步的讨论到此可以结束,下面实现第一步。
上面的代码中只有一个t04的变量未定义,这就是接着要讨论的前面第一部分提出的第一步:动态的报表栏目。使用数据库是自然的选择,为实现这个目的,我设计了两个数据表;
一个表(table1)用于保存该种报表的信息,结构如下:
t01:数值型,报表编号;
t02:文本型,报表名称;
t03:数值型,报表种类,指年报、季报或月报等,本文不使用;
t04:数值型,该报表的栏目数,t04变量也取自这个值。

另一个表(table2)用于存储具体的栏目名称,结构如下:
t01:数值型,对应上表中的t01;
xm1:文本型,栏目名称1;
xm2:文本型,栏目名称2;
以下是重复的栏目名称,一般增加到xm50(栏目名称50)就足够了。

于是接下来要做的是根据用户的选择的报表种类,读取一表中的t04,然后循环读取二表的栏目填充到msflexgrid的左栏。
由于数据库操作的特点和msflexgrid控件的特性,操作十分简单,基本代码如下:
Set adorepRS1 = adorepConn.OpenRecordset("Select * From table2 WHERE t01=" & t01)
For i = 1 To t04
MSFlexGrid1.Row = i
MSFlexGrid1.Col = 0
MSFlexGrid1.Text = adorepRS1.Fields(i)
Next i
adorepRS1.Close
因为考虑到重新选择了报表,所以需要再进行一些msflexgrid和textbox的初始化:
MSFlexGrid1.Cols = 2
MSFlexGrid1.Rows = t04 + 1 '表中总的列、行数

MSFlexGrid1.Col = 1
MSFlexGrid1.Row = 1  ' 网格的列、行初始位置
MSFlexGrid1.LeftCol = 1
MSFlexGrid1.TopRow = 1   '网格中左上角的列、行初始位置
Text1.Left = MSFlexGrid1.Left + MSFlexGrid1.ColWidth(0) _
           + MSFlexGrid1.GridLineWidth * 12
Text1.Top = MSFlexGrid1.Top + MSFlexGrid1.RowHeight(0) _
           + MSFlexGrid1.GridLineWidth * 12
Text1.Text = ""
Text1.SetFocus

结论:
我的开发和使用环境:windows98第二版,visual basic 6.0企业版;
到此为止,两个目的都得到了实现,经我在实际的应用程序中使用,效果比通常的设计方式简单,统一了录入方式,增加报表也仅是插入一条数据库记录。程序在运行时会自动地读取所需的信息。
同时,希望通过我对这两个使用广泛的控件的不同的处理方式,以及对一些控件事件的复杂处理,扩展大家使用控件的范围和方式。在此基础上进行更多的应用扩展。
欢迎大家提出意见和建议。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
VB实现类电子表格grid的数据录入
Python操作docx文档设置居中并创建表格
VB MSFlexGrid控件的几种简单的使用方法
java-poi设置excle的字体和单元格颜色
高级软件工程第三次作业:数独游戏界面功能
用jQuery合并表格中相同文本的相邻单元格
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服