在最初选定这个控件作为表格的显示容器来说,也曾经尝试使用mshflexgrid控件。毕竟第一次机房收费系统就使用的那个控件。控件的好坏咱不做评价。
mshflexgrid这个控件,类似于excel,使用的时候需要循环赋值,然后再显示出来。期间运行多长时间,我不太清楚。总感觉很浪费吧。之后又接触了一个DataGridView控件,虽然表格的显示都差不多,用法也几乎类似。
在使用三层架构的机房收费系统里面,很多的数据传递的时实体或者是表格。对于传递表格情况来说,直接把表格通过一个控件来显示出来就行了呗。所以本次机房收费系统,就使用了DataGridView作为表格的容器。
DataGridView作为显示的方法:
既然要作为表格显示使用,就肯定要有表头,数据来源等问题吧。
如果为了图方便,在使用DataGridView的时候,可以设置数据源DataSource来替前设置要显示的数据信息,这样,在使用的时候,稍添加一些限制,即可做到查询。
在知道以上那种方法之前,曾经考虑过一个问题,作为查询显示的表格,已经从D层,把表格处理好并且以此传回到U层了,在这种情况下,直接把返回来的dataTable作为数据源显示,同样可以达到目的。这样就省去设置数据源,测试链接等问题。
在三层之间传递的是DataTable,dataTable作为一个虚拟表,把虚拟表优化之后,直接传递到DataGridView中显示。如果因为数据库里面的字段与要显示的字段不一致,那么通过SQL语句处理好之后在作为返回值传递。
在纠结dataGrid控件,列表头等问题的时候。直接使用sql语句来优化,之后直接使用DataGrid显示。
接下来看一个查询余额实例实现过程:
U层:
Private Sub btnQuery_Click(sender As Object, e As EventArgs) Handles btnQuery.Click
'验证 两个文本框中是否为空
Dim MyObject As New UIcommonFunction
If MyObject.verifyNull(Controls) = False Then
Exit Sub
End If
Dim queryBll As New BLL.SqlQueryRecordBLL
Try
Dim dtRechargeLog As New DataTable
dtRechargeLog = queryBll.QueryRechargeLog(txtCardNo.Text)
dataGrid.DataSource = dtRechargeLog
Catch ex As Exception
MessageBox.Show(ex.Message.ToString())
End Try
End Sub
U层中使用了一个公有的函数:
''' <summary>
''' 验证文本框是否为空
''' </summary>
''' <param name="log"></param>
''' <returns></returns>
''' <remarks></remarks>
Public Function verifyNull(log As Windows.Forms.Control.ControlCollection) As Boolean
Dim objCon As New Control
Dim flag As Boolean = True '默认 所有文本框都不为空
'开始检测每个控件 是否为空的判断
For Each objCon In log
If TypeOf (objCon) Is TextBox And objCon.Visible = True Then
If objCon.Text = "" Then
MsgBox(objCon.Tag.ToString & " 不能为空,请输入完整", vbOKOnly, "提示")
objCon.Focus()
flag = False
Return flag
End If
ElseIf TypeOf (objCon) Is ComboBox And objCon.Visible = True Then
If objCon.Text = "" Then
MsgBox(objCon.Tag.ToString & " 不能为空,请输入完整", vbOKOnly, "提示")
objCon.Focus()
flag = False
Return flag
End If
End If
Next objCon
Return True
End Function
之后调用B层
''' <summary>
''' 获取充值记录
''' </summary>
''' <param name="cardNo"></param>
''' <returns></returns>
''' <remarks></remarks>
Public Function QueryRechargeLog(cardNo As String) As DataTable
Dim iStudent As IDAL.IStudent
iStudent = Factory.DBFactory.CreateStudent
Dim iRechargeLog As IDAL.IRechargeLog
iRechargeLog = Factory.DBFactory.CreateRechargeLog
Dim dtStudent As New DataTable
dtStudent = iStudent.QueryStudent(cardNo)
'验证用户的卡号是否存在
If dtStudent.Rows.Count = 0 Then
Throw New Exception("卡号不存在")
End If
Dim dtRechargeLog As New DataTable
dtRechargeLog = iRechargeLog.GetRechargeLog(cardNo)
Return dtRechargeLog
End Function
之后,表格的处理完全使用SQL语句来优化处理的:
''' <summary>
''' 查询指定时间段内的 收取金额
''' </summary>
''' <param name="stime">开始日期</param>
''' <param name="etime">终止日期</param>
''' <returns></returns>
''' <remarks></remarks>
Public Function GetRechargeInDate(stime As String, etime As String) As DataTable Implements IDAL.IRechargeLog.GetRechargeInDate
Dim strSQL As String = "select identity(int,1,1) as 序号,cardNo as 卡号,addCash as 充值金额,date as 日期,time as 时间,UserId as 操作人,status as 状态 into #1 from Recharge_Info where date between @sTime and @eTime select * from #1 drop table #1"
Dim sqlparams As SqlParameter() = {New SqlParameter("@sTime", stime),
New SqlParameter("@eTime", etime)}
Dim helper As New SqlHelper
Dim dtRechargelog As New DataTable
dtRechargelog = helper.Query(strSQL, CommandType.Text, sqlparams)
Return dtRechargelog
End Function
接口与工厂,与上个Demo类似,自行补充吧。
DataGridView作为一个表格控件,可以事先设计好模版,之后显示,也可以仅仅作为一个容器来使用。sql语句可以处理的事情有很多,完全可以后台处理之后直接显示。
有很多对表操作的地方,都可以用sql处理里面的知识解决。 视图 虚拟表就和很好的应用。