5.4.3 图书基本信息管理功能
在实现了系统主窗体、登录功能、模块和自定义控件之后,我们再分析一个具有典型代表意义的“图书基本信息管理功能”是如何实现的(见图5-3和图5-4)。在这个子窗体中,我们将通过编程实现对数据库记录的添加、删除、定位导航等基本操作。
以下是其具体实现过程:
“图书基本信息管理”子窗体的组成和各控件设置参照图5-14和图5-15。
1)添加子窗体
“图书基本信息管理”窗体是系统主窗体(MDI)的子窗体,一般来说,多文档窗体只有一个主窗体,可以有多个子窗体。当主窗体(frmMain.frm)设置好后,添加子窗体的方法是在工程资源管理器中正常添加普通窗体类型,然后将该窗体的MDIChild属性设置为真(True)即可。本子窗体的名称设置为“frmBookInfo.frm”。
2)添加SSTab控件
子窗体中的选项卡我们使用SSTab控件来实现,该控件并不在常用工具箱中,需要我们手工来添加,添加的方法参照5.3.3添加工具栏和状态栏控件的步骤,只是在“部件选择对话框”中需要选择“Microsoft Tabbed Dialog Control 6.0(SP6)”选项。当工具箱中出现SSTab图标后,就可以绘制选项卡区域了。默认的SSTab控件有3个选项卡,可以通过调整SSTab控件的Tabs属性值,来改变选项卡的个数。
图5-14 图书信息管理子窗体设计1
图5-15 图书信息管理子窗体设计2
3)添加DataGrid控件
添加DataGrid控件的过程与SSTab一样,先在工具箱中右击鼠标,在弹出的“部件选择对话框”选择“Microsoft DataGrid Control 6.0(SP6)(OLEDB)”即可。DataGrid控件是对数据库进行操作时候经常使用的一种功能非常强大的表格控件。它是一种类似于数据表的绑定控件,可以显示一系列行和列来表示Recordset对象的记录和字段。可以使用Data-Grid来创建一个允许最终用户阅读和写入到绝大多数数据库的应用程序。DataGrid控件可以在设计时快速进行配置,只需少量代码或无需代码。当在设计时设置了DataGrid控件的DataSource属性后,就会用数据源的记录集来自动填充该控件以及自动设置该控件的列标头。
在我们的案例程序中,仅使用DataGrid控件进行数据的显示,不做特别复杂的其他操作,只需要按照图5-15所示绘制一个名为“DataGrid1”的控件区域即可。数据的绑定等相关操作我们通过程序代码来实现。
4)添加Frame和功能按钮
图5-14所示的图书详细信息的下边导航功能区,是通过8个按钮来实现的。设置方法是先添加一个Frame(框架)控件,并把Frame控件的Caption属性清空,调整背景区域的颜色等相关设置。然后绘制8个按钮,并按图5-14所示调整按钮的位置和各按钮的Caption值。为了给按钮添加图像元素,需要先修改各按钮的Style的值为1-Graphical,然后再通过按钮的Picture属性添加图像(图像需要自己准备,像素不要大,JPG格式即可)。将各按钮的名称修改如下:添加(cmdAddNew)、删除(cmdDel)、保存(cmdSave)、取消(cmdCancel)、第一个(cmdFirst)、前一个(cmdPrevious)、下一个(cmdNext)、最后一个(cmdLast)。
所有控件设置好后,进行代码编写如下:
(该代码有典型代表意义,其他几个子功能窗口代码与此类似)
代码5-6 图书信息管理功能代码
′****************************************************************************
Dim addnewflag As Boolean ′全局变量起标记作用
Private Sub dcbPubId_GotFocus() ′出版社ID列表获取焦点
dcbpubId.BackColor=vbYellow
dcbpubId.ForeColor=vbBlue
End Sub
Private Sub dcbPubId_LostFocus() ′出版社ID列表失去焦点
dcbpubId.BackColor=vbWhite
dcbpubId.ForeColor=vbBlue
End Sub
Private Sub dcbcatId_GotFocus() ′分类号ID列表获取焦点
dcbCatId.BackColor=vbYellow
dcbCatId.ForeColor=vbBlue
End Sub
Private Sub dcbcatId_LostFocus() ′分类号ID列表失去焦点
dcbCatId.BackColor=vbWhite
dcbCatId.ForeColor=vbBlue
End Sub
Private Sub cmdCatOpen_Click() ′分类代号扩展按钮点击
frmCatInfo.Show
frmCatInfo.SetFocus
End Sub
Private Sub cmdPubOpen_Click() ′出版社ID扩展按钮点击
frmPubInfo.Show
frmPubInfo.SetFocus
End Sub
Private Sub Form_Load()
′设置顶端的标题Label
lblInfo.Left=Me.ScaleLeft
lblInfo.Top=Me.ScaleTop
lblInfo.Width=Screen.Width
′设置选项卡
sstabBookInfo.Top=lblInfo.Top+450
sstabBookInfo.Left=70
sstabBookInfo.Width=Screen.Width-200
sstabBookInfo.Height=Screen.Height-2650
′设置数据表格控件
DataGrid1.Top=lblInfo.Top+500
DataGrid1.Left=100
DataGrid1.Width=Screen.Width-550
DataGrid1.Height=Screen.Height-3300
DataGrid1.Visible=False
′为DataGrid1控件设置数据源,使之与rsBookInfo记录集连接
Set DataGrid1.DataSource=rsBookInfo
′数据源绑定
DataGrid1.ReBind
′调整Frame控件位置 8个按钮统一随动
Frame2.Left=(Screen.Width-Frame2.Width)/2
′调用display函数 使文本框等控件显示记录集中数据(默认显示第一条记录)
Call display
End Sub
′===============================
′“第一个”按钮点击
Private Sub cmdFirst_Click()
On Error Resume Next
rsBookInfo.MoveFirst ′记录集指针移动到第一条
Call display
End Sub
′“最后一个”按钮点击
Private Sub cmdLast_Click()
On Error Resume Next
rsBookInfo.MoveLast
Call display
End Sub
′“下一个”按钮点击
Private Sub cmdNext_Click()
On Error Resume Next
rsBookInfo.MoveNext
If rsBookInfo.EOF Then ′判断下一条记录是否存在
rsBookInfo.MoveLast
MsgBox″最后一条记录″,vbInformation,″最后一条记录″
Else
Call display
End If
End Sub
′“前一个”按钮点击
Private Sub cmdPrevious_Click()
On Error Resume Next
rsBookInfo.MovePrevious
If rsBookInfo.BOF Then
rsBookInfo.MoveFirst
MsgBox″已是第一条记录″,vbInformation,″已是第一条记录″
Else
Call display
End If
End Sub
′“取消”按钮点击
Private Sub cmdCancel_Click()
cmdAddNew.Enabled=True
cmdDel.Enabled=True
cmdFirst.Enabled=True
cmdLast.Enabled=True
cmdPrevious.Enabled=True
cmdNext.Enabled=True
cmdCancel.Enabled=False
rsBookInfo.CancelUpdate ′结束更改记录集数据
Call display
End Sub
′“添加”按钮点击 将新加图书的信息先添加到记录集
′“保存”按钮点击后再将记录集新加的数据添加到数据库
Private Sub cmdAddNew_Click()
On Error Resume Next
Call clear ′调用清除函数
Dim i As Integer
Dim max As Integer
max=0
addnewflag=True
txtpubId.Visible=False
txtCatId.Visible=False
dcbpubId.Visible=True
dcbCatId.Visible=True
cmdAddNew.Enabled=False
For i=0To rsBookInfo.RecordCount ′将现有图书的最大编号值送给变量max
If max<rsBookInfo(0)Then
max=rsBookInfo(0)
End If
rsBookInfo.MoveNext
Next i
rsBookInfo.MoveFirst
cmdCancel.Enabled=True
cmdDel.Enabled=False
cmdFirst.Enabled=False
cmdLast.Enabled=False
cmdPrevious.Enabled=False cmdNext.Enabled=False
For i=0To rsPubId.RecordCount ′出版社代码自动加载到列表
dcbpubId.AddItem rsPubId(0)
rsPubId.MoveNext
If rsPubId.EOF=True Then
rsPubId.MoveLast
dcbpubId.ListIndex=0
Exit For
End If
Next i
For i=0To rsCatId.RecordCount ′分类代码自动加载到列表
dcbCatId.AddItem rsCatId(0)
rsCatId.MoveNext
If rsCatId.EOF=True Then
rsCatId.MoveLast
dcbCatId.ListIndex=0
Exit For
End If
Next i
rsBookInfo.AddNew
txtBookId=max+1 ′保证新添加的图书编号为原有最大号码加1图书号为自动设置
txtBookName.SetFocus
End Sub
′删除记录
Private Sub cmdDel_click()
On Error Resume Next
If MsgBox(″确认删除么?″,vbOKCancel+vbExclamation,″删除记录″)=vbOK Then
rsBookInfo.Delete
rsBookInfo.MoveNext
If rsBookInfo.EOF Then
rsBookInfo.MoveLast
MsgBox″最后一条记录″
End If
Call display
End If
End Sub
′保存记录 是真正的保存,将添加的数据放入数据库
Private Sub cmdsave_click()
On Error Resume Next
If txtBookId.Text=″″Or txtBookName.Text=″″Or txtAuthor.Text=″″Then
MsgBox″保存错误!!!数据添加失败!″,vbCritical,″请添加全部数据″
txtBookId.SetFocus
Exit Sub
End If
Call assign
rsBookInfo.Save ′该操作会使新的记录添加到数据库
MsgBox″保存成功″,vbInformation,″已保存成功″
cmdDel.Enabled=True
cmdFirst.Enabled=True
cmdLast.Enabled=True
cmdPrevious.Enabled=True
cmdNext.Enabled=True
cmdAddNew.Enabled=True
cmdCancel.Enabled=False
Exit Sub
End Sub
′定义“清除”功能函数,支持作用
Private Sub clear()
txtBookId.Text=″″
txtBookName.Text=″″
txtAuthor.Text=″″
txtpubId.Text=″″
txtCatId.Text=″″
End Sub
′定义Display函数,从数据集中提取数据到控件中
Private Sub display()
txtpubId.Visible=True
txtCatId.Visible=True
dcbpubId.Visible=False
dcbCatId.Visible=False
cmdCancel.Enabled=False
txtBookId.Text=Str(rsBookInfo(0))&″″ ′添加空格字符,避免空记录添加到控件会报错
txtBookName.Text=rsBookInfo(1)&″″
txtAuthor.Text=rsBookInfo(2)&″″
txtpubId.Text=Str(rsBookInfo(3))&″″
txtCatId.Text=Str(rsBookInfo(4))&″″
End Sub
′将控件中的数据添加到记录集对应的列
Private Sub assign()
If addnewflag=True Then
rsBookInfo(0)=Val(Trim$(txtBookId.Text)) ′转换文本成数据
rsBookInfo(1)=Trim$(txtBookName.Text)
rsBookInfo(2)=Trim$(txtAuthor.Text)
rsBookInfo(3)=Val(Trim$(dcbpubId.Text))
rsBookInfo(4)=Val(Trim$(dcbCatId.Text))
addnewflag=False
Else
rsBookInfo(0)=Val(Trim$(txtBookId.Text))
rsBookInfo(1)=Trim$(txtBookName.Text)
rsBookInfo(2)=Trim$(txtAuthor.Text)
rsBookInfo(3)=Val(Trim$(txtpubId.Text))
rsBookInfo(4)=Val(Trim$(txtCatId.Text))
End If
End Sub
′选项卡点击使数据表在对应的选项卡中显示
Private Sub sstabBookInfo_Click(PreviousTab As Integer)
If PreviousTab=0Then
DataGrid1.Visible=True
Else
DataGrid1.Visible=False
End If
End Sub
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。