在做机房收费系统,遇到这样一个问题:在上下机窗体(FrmLoadOnff)中,存在一个文本框(txtCountOnline)显示当前上机的学生数。在查询学生上机状态的窗体中,存在全部学生下机菜单(menuAllLoadoff)、和选中学生下机菜单(menuSelectLoadoff)。界面分别如下:
上下机窗体(FrmLoadOnff):
查询学生上机状态:
如果在学生状态窗体中,实现学生下机的功能,要更新上下机窗体中的文本框内上机学生的人数。
第一次做的时候,没想太多。思路是:多条上机的学生记录,在一个循环中一条记录一条记录的删除,每删一条记录,更新一次上下机窗体中文本框内正在上机的学生数。所以,代码如下:
'学生状态查询窗体,更新上下机窗体学生数目减1 Dim intPreCount As Integer '更新前学生数 Dim intCurrentCount As Integer '更新后的学生数 intPreCount = CInt(FrmLoadOnOff.txtCountOnLine.Text) intCurrentCount = intPreCount - 1 FrmLoadOnOff.txtCountOnLine.Text = intCurrentCount.ToString '将更新后的学生数更新到上下机窗体中
会提示这样的信息:
经过查网上的资料,实践两个窗体之间的传值的方法很多种,主要有四种。我这里分析错误原因是:在VB.net中,窗体都是类,需要实例化成对象之后才能在其他窗体调用。我的代码没有经过实例化,直接使用了类,所以上下机窗体中的上机学生数并没有更新到查询学生状态的窗体中。
所以,一种方法是,在调用其他窗体前,先将窗体类实例化,再进行操作。
Module ChargeSystemMoudel '在模块中定义的全局变量,表示学生的数目 Public intCountOnline As Integer
Private Sub menuAllLoadoff_Click(sender As Object,e As EventArgs) Handles menuAllLoadoff.Click '得到正在上机的学生数目 Dim stuCount As Integer stuCount = DGVStuOnline.Rows.Count '从最后一条记录,开始下机 For i = stuCount - 1 To 0 Step -1 Dim stuCardNo As String '取得DataGridView控件中。学生上机记录的卡号字段值 stuCardNo = Trim(DGVStuOnline.Rows(stuCount - 1).Cells("卡号").Value.ToString) Dim updateStuLoad As New ManageStuLoadBLL '定义学生实体,按学生卡号更新上机记录 Dim enStuOnOff As New StuOnOffEnity enStuOnOff.CardNO = stuCardNo Try '对当前学生,在数据库表中进行记录更新 updateStuLoad.UpdateLoadRecordStu(enStuOnOff) Catch ex As Exception Throw ex End Try '将记录从DataGridVied中删除。 DGVStuOnline.Rows.RemoveAt(DGVStuOnline.Rows(stuCount - 1).Index) stuCount = Me.DGVStuOnline.Rows.Count '上下机窗体,学生数目减1 intCountOnline = intCountOnline - 1 Next '显示上下机窗体 FrmLoadOnOff.Show() MsgBox("全部下机完成") End Sub
其实,无论第一种、第二种,到此为止,只是完成了传值,但是并没有更新。经过多次的尝试与请教,如果上下机窗体中显示当前的学生数,就要将上下机窗体加载,所以,我添加了显示的方法。在上下机窗体加载的时候,更新学生的数目。
上下机窗体加载的代码:
Private Sub FrmLoadOnOff_Load(sender As Object,e As EventArgs) Handles MyBase.Load ' Enter响应上机事件() Me.AcceptButton = Me.btnLoadOn Dim getmytime As New GetDateTimeBll Dim CurrentTime As String '获得服务器当前的时间 CurrentTime = getmytime.GetTime() txtCurrentTime.Text = CurrentTime '查询数据库,获得正在上机的学生数目 Dim intCount As Integer Dim dtOnlineStu As DataTable Dim CurrentStu As New ManageStuLoadBLL dtOnlineStu = CurrentStu.QueryOnlineStu() intCount = dtOnlineStu.Rows.Count txtCountOnLine.Text = intCount.ToString() 'txtCountOnLine.Text = intCountOnline.ToString() End Sub
PS:崔师哥说,很简单不难,我用了N久,青峰帮忙分析了学习上的问题,还是收获颇丰的。