1、第9章 项目开发案例9.3 公共模块设计公共模块的功能主要是存贮在整个项目的各个模块中通用的全局变量和全局函数。在该模块中定义了全局变量intRole、strUname等,分别用于表示操作员的权限和姓名,并定义了全局函数connect()和全局函数subQuit(),分别用于创建连接(数据源)和关闭连接并退出应用程序。具体代码如下:Module pubPublic cn As Data.OleDb.OleDbConnection 定义全局连接对象Public intRole As Integer 登录操作员权限Public strUname As String 登录操作员姓名Public st
2、rFind(9) As String 查询档案维护条件Public strFindname As String 查询成绩档案的学生姓名Public strFindID As String 查询成绩档案的学生IDPublic Sub connect()cn = New Data.OleDb.OleDbConnectioncn.ConnectionString = Data Source= & Application.StartupPath & students.mdb;Provider=Microsoft.Jet.OLEDB.4.0End Sub下面定义函数subQuit()用于处理在系统退出前
3、关闭数据源,并退出整个应用程序。Public Sub subQuit() If cn.State = ConnectionState.Open Then 此处的条件也可以写成cn.State =1cn.Close()Application.Exit()End SubEnd Module9.4.2 欢迎窗体代码设计该窗体的主要功能是显示欢迎信息,调用连接函数创建连接,并检测数据源连接的正确性。具体代码如下:Public Class WelcomePrivate Sub Welcome_Click(ByVal sender As Object, ByVal e As System.EventArg
4、s) Handles Me.ClickCall connect()Trycn.Open()Catch ex As Data.OleDb.OleDbExceptionMessageBox.Show(ex.Message & 连接错误,程序将退出!, 数据库连接错误, MessageBoxButtons.OK, MessageBoxIcon.Error)Application.Exit()End TryDim frmLogin As New FrmLoginfrmLogin.ShowDialog()End SubEnd Class9.4.4 “操作员登录”代码设计整个模块结构编程如下:Public
5、 Class frmLoginDim dtbLogin As New DataTablePrivate Sub TxtUID_KeyPress(ByVal sender As Object, ByVal e As System.Windows. Forms. KeyPressEventArgs) Handles TxtUID.KeyPressIf Asc(e.KeyChar) = Windows.Forms.Keys.Enter ThenTxtUPWD.Focus()End IfEnd SubPrivate Sub TxtUPWD_TextChanged (ByVal sender As Sy
6、stem.Object, ByVal e As System.EventArgs) Handles TxtUPWD. TextChanged()ButLogin.Enable=TrueEnd SubPrivate Sub TxtUPWD_KeyPress(ByVal sender As Object, ByVal e As System.Windows. Forms. KeyPressEventArgs ) Handles TxtUPWD.KeyPressIf Asc(e.KeyChar) = Windows.Forms.Keys.Enter ThenButLogin.Focus()End I
7、fEnd SubPrivate Sub ButLogin_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButLogin.ClickIf txtUID.Text = ThenMessageBox.Show(请输入操作员!, 错误, MessageBoxButtons.OK, MessageBoxIcon.Error)txtUID.Focus()Exit SubEnd IfIf txtUPWD.Text = ThenMessageBox.Show(请输入密码!, 错误, MessageBoxBu
8、ttons.OK, MessageBoxIcon.Error)txtUPWD.Focus()Exit SubEnd IfTryDim adpLogin As New OleDb.OleDbDataAdapter(select * from user where uid= & txtUID.Text & and upwd= & txtUPWD.Text & , cn)dtbLogin.Clear()adpLogin.Fill(dtbLogin)Catch ex As OleDb.OleDbExceptionMessageBox.Show(ex.Message, 查询错误, MessageBoxB
9、uttons.OK, MessageBoxIcon.Error)Exit SubEnd TryIf dtbLogin.Rows.Count = 1 ThenstrUname = dtbLogin.Rows(0).Item(Uname)intRole = dtbLogin.Rows(0).Item(Urole)Dim frmMain As New FrmMainMe.Dispose()aa = frmMainfrmMain.ShowDialog()ElseMessageBox.Show(操作员或密码错误!, 登录失败, MessageBoxButtons.OK, MessageBoxIcon.I
10、nformation)txtUID.SelectAll()txtUID.Focus()Exit SubEnd IfEnd SubPrivate Sub ButQuit_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButQuit.ClickCall subQuit()End SubEnd Class9.5 主界面设计2代码设计这里的代码设计主要有两部分,一是当主窗体初次显示时,应处理状态栏中的显示信息。二是对各菜单项的单击事件的处理。除“退出系统”项外,各子菜单项的处理基本一致。这里给出“添加
11、操作员”和“档案录入”两项,其余可参照编写。具体代码如下:Public Class FrmMain主窗体初次显示时,应处理状态栏中的显示信息Private Sub FrmMain_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.LoadToolStrip2.Text = 操作员: & strUname & ToolStrip3.Text = NowEnd Sub “添加操作员”菜单项处理Private Sub mnuAdduser_Click(ByVal sender As Syst
12、em.Object, ByVal e As System.EventArgs) Handles mnuAdduser.ClickDim aa As FormFor Each aa In Me.MdiChildrenIf LCase(aa.Name) = frmUserAdd ThenExit SubEnd IfNextDim frmUserAdd As New FrmUserAddfrmUserAdd.MdiParent = MefrmUserAdd.Show()End Sub“修改操作员信息”菜单项处理Private Sub mnuEditUser_Click(ByVal sender As
13、 System.Object, ByVal e As System.EventArgs) Handles mnuEditUser.ClickDim aa As FormFor Each aa In Me.MdiChildrenIf LCase(aa.Name) = frmEditUser ThenExit SubEnd IfNextDim frmEditUser As New FrmDaAddfrmEditUser.MdiParent = MefrmEditUser.Show()End Sub “删除操作员”菜单项处理Private Sub mnuDelUser_Click(ByVal sen
14、der As System.Object, ByVal e As System.EventArgs) Handles mnuDelUser.ClickDim aa As FormFor Each aa In Me.MdiChildrenIf LCase(aa.Name) = frmDelUser ThenExit SubEnd IfNextDim frmDelUser As New FrmDaAddfrmDelUser.MdiParent = MefrmDelUser.Show()End Sub “档案录入”菜单项处理Private Sub mnuDaadd_Click(ByVal sende
15、r As System.Object, ByVal e As System.EventArgs) Handles mnuDaadd.ClickDim aa As FormFor Each aa In Me.MdiChildrenIf LCase(aa.Name) = frmDaadd ThenExit SubEnd IfNextDim frmDaAdd As New FrmDaAddfrmDaAdd.MdiParent = MefrmDaAdd.Show()End Sub退出菜单项处理Private Sub mnuQuit_Click(ByVal sender As System.Object
16、, ByVal e As System.EventArgs) Handles mnuQuit.ClicksubQuit()End SubEnd Class9.6 增加操作员模块设计9.6.2 代码设计这里要处理的事件较多,包括各个文本框的KeyPress事件,按钮ButAdd和ButRet的Click事件。这里只给出两个按钮的Click事件,各文本框的KeyPress事件请参看9.4节的有关内容。(1)“添加”按钮ButAdd是最主要的要处理的控件,当鼠标单击时,应检查操作员ID、姓名、密码及确认密码的输入情况,并作出相应处理。如果一切正常,应将记录写入数据源表中。(2)对于“返回”按钮But
17、Ret,当鼠标单击时,关闭并释放本窗体。具体编程如下:Inherits System.Windows.Forms.FormDim adpAdduser As OleDb.OleDbDataAdapterDim dtbAdduser As New DataTablePrivate Sub ButAdd_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButAdd.ClickIf txtUid.Text = ThenMessageBox.Show(请输入操作员ID!, 输入提示, MessageBo
18、xButtons.OK, MessageBoxIcon.Information)txtUid.Focus()Exit SubEnd IfIf txtUname.Text = ThenMessageBox.Show(请输入操作员姓名!, 输入提示, MessageBoxButtons.OK, MessageBoxIcon.Information)txtUname.Focus()Exit SubEnd IfIf txtUpwd.Text = ThenMessageBox.Show(请输入密码!, 输入提示, MessageBoxButtons.OK, MessageBoxIcon.Informat
19、ion)txtUpwd.Focus()Exit SubEnd IfIf txtUpwd1.Text = ThenMessageBox.Show(请输入确认密码!, 输入提示, MessageBoxButtons.OK, MessageBoxIcon.Information)txtUpwd1.Focus()Exit SubEnd IfIf txtUpwd.Text txtUpwd1.Text ThenMessageBox.Show(两次输入的密码不一致,请确认!, 输入提示, MessageBoxButtons.OK, MessageBoxIcon.Information)txtUpwd1.Se
20、lectAll()txtUpwd1.Focus()Exit SubEnd IfadpAdduser = New OleDb.OleDbDataAdapter(select * from user where uid= & Trim(txtUid.Text) & , cn)dtbAdduser.Clear()adpAdduser.Fill(dtbAdduser)If dtbAdduser.Rows.Count = 1 ThenMessageBox.Show(该操作员已存在,请更换ID!, 输入提示, MessageBoxButtons.OK, MessageBoxIcon.Information
21、)txtUid.SelectAll()txtUid.Focus()Exit SubEnd If开始保存用户记录dtbAdduser.Clear()Dim Sql As String = INSERT INTO user(uid,upwd,uname,urole) VALUES( & Trim(txtUid.Text) & , & Trim(txtUpwd.Text) & , & Trim(txtUname.Text) & , & IIf(RadioButtonl.Checked = True, 1, 2) & )adpAdduser = New OleDb.OleDbDataAdapter(S
22、ql, cn)adpAdduser.Update(dtbAdduser)txtUid.Text = txtUpwd.Text = txtUpwd1.Text = txtUname.Text = txtUid.Focus()MessageBox.Show(用户记录保存完毕!, 添加成功, MessageBoxButtons.OK, MessageBoxIcon.Information)End SubPrivate Sub ButRet_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButRet.
23、ClickMe.Close()Me.Dispose()End Sub9.7 修改操作员信息模块设计9.7.2 代码设计该窗体要处理的事件如下:(1)窗体的Load事件。应处理的问题包括连接数据源、读取数据库中“操作员”表的信息并将其列入列表框中。(2)列表框“lsbUid”的SelectedIndexChanged事件。当列表框的选中项发生变化时,相应的操作员ID、姓名、密码、确认密码及权限等相关信息应随之变化。(3)对于“修改”按钮ButEditUser,当鼠标单击时,应将修改后的信息写入到数据库的User表中。(4)对于“返回”按钮ButRet,当鼠标单击时,关闭并释放本窗体。具体编程如下
24、:Public Class FrmEditUserInherits System.Windows.Forms.FormDim adpEdituser As OleDb.OleDbDataAdapterDim dtbEdituser As New DataTablePrivate Sub FrmEditUser_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Loadconnect()Me.Location = New Point(0, 0)adpEdituser = New OleD
25、b.OleDbDataAdapter(SELECT uid,uname FROM Students.user, cn)adpEdituser.Fill(dtbEdituser)Dim i As IntegerFor i = 0 To dtbEdituser.Rows.Count - 1lsbUid.Items.Add( & dtbEdituser.Rows(i).Item(0)Next iEnd SubPrivate Sub lsbUid_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArg
26、s) Handles lsbUid.SelectedIndexChangeddtbEdituser.Clear()adpEdituser = New OleDb.OleDbDataAdapter(SELECT * FROM students.user WHERE Uid= & Trim(lsbUid.SelectedItem) & , cn)adpEdituser.Fill(dtbEdituser)If dtbEdituser.Rows.Count 0 ThentxtUid.Text = dtbEdituser.Rows(0).Item(uid)txtUname.Text = dtbEditu
27、ser.Rows(0).Item(uname)txtUpwd.Text = dtbEdituser.Rows(0).Item(upwd)txtUpwd1.Text = dtbEdituser.Rows(0).Item(upwd)If dtbEdituser.Rows(0).Item(urole) = 1 ThenrdbNormal.Checked = TrueElserdbSuper.Checked = TrueEnd IfElseMessageBox.Show(没有找到相关记录!, 查询提示, MessageBoxButtons.AbortRetryIgnore, MessageBoxIco
28、n.Information)Exit SubEnd IfEnd SubPrivate Sub ButEdit_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButEdit.ClickdtbEdituser.Clear()adpEdituser = New OleDb.OleDbDataAdapter(UPDATE students.user SET Uname= & Trim(txtUname.Text) & ,Upwd= & _Trim(txtUpwd.Text) & ,Urole= & I
29、If(rdbNormal.Checked = True, 1, 2) & WHERE Uid= & Trim(lsbUid.SelectedItem) & , cn)adpEdituser.Fill(dtbEdituser)MessageBox.Show(用户记录修改完毕!, 保存完毕, MessageBoxButtons.OK, MessageBoxIcon.Information)End SubPrivate Sub ButQuit_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButQu
30、it.ClickMe.Close()Me.Dispose()End SubEnd Class9.8 档案录入模块设计9.8.2代码设计本窗体需要处理的事件共有四个,即窗体自身的Load事件、下拉列表框控件TxtMonth的SelectedIndexChanged事件、按钮ButSave和ButRet的Click事件。(1)当窗体调入时,应填充各下拉列表框控件。其中的“民族”下拉框的填充使用了数据源中的nation表中的数据。(2)由于不同月份对应的天数不同,所以当所选择的月份发生变化时,应重新填充日期下拉框。(3)对于“保存”按钮ButSave,当鼠标单击时,应检查各控件的输入或选择情况,并作出相应处理。(5)对于“返回”按钮ButRet,当鼠标单击时,应关闭并释放窗体。整个模块结构编程如下:Public Class FrmDaAddInherits System.Windows.Forms.FormDim adpDaAdd As OleDb.OleDbDataAdapterDim dtbDaAdd As New DataTableDim cmdInsert As OleDb.OleDbCommandPrivate Sub FrmDaAdd_Load(ByVal