vb.net机房收费 & 泛型集合-实现文本框显示记录

     做基本数据设定窗体,本以为实现这个小小的窗体应该是最简单的吧!不就是单击修改按钮,进行修改;然后单击更新按钮来对数据基本设定进行更新吗?可是当一出手就遇到了问题,数据表中的数据该怎么显示在文本框中呢?这真的一下子难住了自己!不过遇到问题总会有解决的办法。

既然是让实体一个一个返回到文本框中来,那么直接调用实体层应该就可以吧!这样不就可以完美的实现了吗?可是这样最大的缺点则是:以后遇到的控件与数据调用的窗体比比即是,这样不就又重蹈覆辙实现了代码的重复吗?很严重的违背了为了把重复的部分提取出来,方便以后的调用,所以用到了泛型集合。

     那么首先分析一下什么情况下使用泛型集合呢?在基本数据设定中,我们想要实现的功能就是将数据表中的信息转换成为一个一个的实体,然后添加到文本框中,所以我们就可以将数据表中的一个一个的实体作为参数传递给泛型类型,进而得到自己想要的。

     由于List是ArrayList的泛型等效类,属于动态数组,正好可以满足自己的需求。我们可以讲类型看做一个模板,这样模板中的变体部分就可以被传来的 类名称所代替,从而得到一个新的定义。

在此之前对于实体层的建立是必不可少的,因为创建集合的基础是要有类,然后才能将对象放入集合中。

建立的EntityModel:

'********************************
'说明:泛型集合,完成datatable类型转化为实体类
'作者:霍亚静
'小组:XX
'创建日期:2014-07-20 22:28:21
'版本号:V1.00
'********************************
Imports System.Collections.Generic    '增加泛型的命名空间,用来管理泛型集合
Imports System.Reflection    '加入反射,为了引用 PropertyInfo
Public Class EntityHelper
    '将datatable转化为泛型集合
    Public Shared Function converToList(Of T As {New})(ByVal dt As DataTable) As IList(Of T)

        Dim myList As New List(Of T)    '定义最终返回的集合
        Dim myType As Type = GetType(T)   '得到实体类的类型名

        Dim dr As DataRow   '定义行集

        Dim TmpName As String = String.Empty    '定义一个临时变量

        '遍历datatable的所有数据行
        For Each dr In dt.Rows
            Dim myT As New T   '定义一个实体类的对象
            Dim propertys() As PropertyInfo = myT.GetType().GetProperties()   '定义属性集合
            Dim pr As PropertyInfo
            '遍历该对象的所有属性
            For Each pr In propertys
                TmpName = pr.Name    '将属性名称赋值给全局变量

                '检查datatable是否包含此列,(列名==对象的属性名)
                If (dt.Columns.Contains(TmpName)) Then    '将此属性与datatable李的列名比较,查看datatable是否包含此属性
                    '判断此属性是否有setter(类)
                    If (pr.CanWrite = False) Then    '判断此属性是否可写,如果不可写,跳出此循环
                        Continue For
                    End If
                    Dim value As Object = dr(TmpName)    '定义一个对象型的列来保存列的值

                    If (value.ToString <> DBNull.Value.ToString()) Then      '判断是否为空,如果非空,则赋给对象的属性
                        pr.SetValue(myT, value, Nothing)     '在运行期间通过反射,动态的访问一个动态的属性
                    End If
                End If
            Next
            myList.Add(myT)    '添加到集合
        Next
        Return myList   '返回实体集合
    End Function
End Class

这样D层就可以直接调用将T_datatable中表集转化成泛型集合

 Public Function ReadBasic() As IList(Of Entity.BasicDataEntity) Implements IDAL.IBasicDataDAL.ReadBasic    '应该使用泛型集合类型

        ''Dim sqlparams As SqlParameter() = {}  '声明并实例化参数数组

        '调用无参数查询()
        'Return clsSqlhelper.Query(strSQL, CommandType.Text)    '调用sqlHelper
        'Return table             '返回查询结果
        'Dim mySqlhelper As Ne'w Sqlhelper.sqlhelper   '定义查询助手类,上文已经定义
        Dim dt As New DataTable   '定义查询到的表集
        Dim myList As List(Of Entity.BasicDataEntity)    '保存转换后的泛型集合
        Dim strSQL As String = "select * from T_BasicData "  '声明并实例化需要执行的SQL语句

        dt = clsSqlhelper.Query(strSQL, CommandType.Text)   '执行查询
        '将dt转换为泛型集合
        myList = EntityHelper.converToList(Of BasicDataEntity)(dt)
        Return myList    '返回一个实体

    End Function

其实整个过程也只是调用了一下泛型集合,改变了一下其类型,和datatable的使用过程还是一样的。

Public Function ReadBasic() As IList(Of Entity.BasicDataEntity)
        '声明并实例化变量InBasic为:调用Factory所返回来的IBasicDataDAL
        Dim inBasic As IBasicDataDAL = factory.BasicDataDAL()     '事先要声明factory的类型,已声明并实例化factory为DataAccess类
        '声明并实例化变量ReadB
        Dim ReadB As IList(Of Entity.BasicDataEntity)
        ReadB = inBasic.ReadBasic()

        Return ReadB     '返回ReadB这个泛型数组

    End Function

这样在U层就可以直接调用其数组,然后显示在文本框中了

 Dim ReadB As IList(Of BasicDataEntity)      '定义泛型集合
        Dim RBasic As New BasicDataBLL           '定义一个b层接口

        ReadB = RBasic.ReadBasic()

        txtRate.Text = ReadB(0).Rate
        txtTmpRate.Text = ReadB(0).TmpRate
        txtLimitCash.Text = ReadB(0).limitCash
        txtLeastTime.Text = ReadB(0).leastTime
        txtPrepareTime.Text = ReadB(0).prepareTime
        txtUnitTime.Text = ReadB(0).unitTime

注:

     其实做完之后,突然又觉得T_datatable中只是存在一条数据,如果仅仅只是来查询一条数据的话,或许直接调用实体层会更简单一点,又比如登陆窗体,当然也可以直接调用泛型集合,但是对此也只是想查询对应的用户名和密码,仅此而已!如果单单的是一个窗体的话,真的是感觉有点大材小用啊!就好像一个大大的水缸,你偏偏在里边放一升的水,那是不是多此一举呢?还不如直接拿一个小小的水杯盛放,来得更直接一些。

     在此使用泛型集合,一是想熟悉一下,再者,整个系统需要用到泛型集合的地方有很多,这里也只是调用了一下公共的部分,减少了重复的代码,又何乐而不为呢?

时间: 2024-11-05 11:56:41

vb.net机房收费 & 泛型集合-实现文本框显示记录的相关文章

【VB.NET 机房收费系统】___爱上视图(View)

简介 计算机数据库中的视图是一个虚拟表,其中内容有查询定义.同真实的表一样,视图包含一系列带有名称的列和行数据.但是,视图并不在数据库中与存储的数据值集形式存在,行和列数据来自由定义视图的查询所引用的表,并且在引用视图时动态生成. ----官方正解 神马虚拟表的,都是浮云--好用才是王道.先来说说如何创建视图. 新建视图 [VB.NET 机房收费系统]--学生查看余额 为例.本人不得不强调的一点是,在你所建立的学生表和卡表中表务必设置主键,不设置的后果就是 相信聪明的你们一定不会犯这么低级的错误

vb.net机房收费系统重构——总结(二)软件工程文档1

学软工时常常听到:这是我们迈向职业化的一步.软件工程文档在一个项目开发中必不可少,通过这次重构,将以前的软件工程,UML重新认识,梳理,实用了一遍有了更深刻的体会,我在机房重构中,一共编写了七个文档,分别是 1.项目开发计划 2.软件需求说明书 3.数据库设计说明书 4.概要设计说明书 5.详细设计说明书 6.机房收费系统测试计划 7.机房收费系统用户操作手册 在这里只讲一下项目开发文档中各种需要的图.表. (一)软件项目开发计划: 文档的目的不用说,在这里面最重要的两个内容:项目的人员分工,以

vb.net机房收费系统——存储过程

一.使用背景 机房收费系统结账的时候,需求是当选择一个用户,同时显示该用注册.充值和退卡记录,这些数据来提供结账数据,而结账之后要同时更新卡.充值.退卡表三个表,如果直接写SQl语句的话会是很复杂的.而这些需求可以封装为一个存储过程,点击结账之后只需要传入参数执行存储过程即可. 二.存储过程简介 存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它.存储过程是数据库中的一个

VB.NET机房收费 &amp; DataGridView与数据库的连接

添加删除用户,这就又要涉及到数据库表中的信息啊!在vb中,我们可以很轻松的调用sql语句与控件完美结合,在VB.NET中当然有着更人性化的方法:直接使用控件连接数据库 具体步骤: 连接数据源:      选择自己所需要的表或视图Or存储过程,在此只是简单的利用语句把User表中的数据显示在DataGridView控件中而已. 自己可以修改相对应的名字: 这样就会出现自己所需要的信息,当然也可以编辑行,列,删除自己所不需要的信息 这样只要一运行,就会出现User表中的所有信息,但是这并不是我们最终

VB.NET机房收费 &amp; 抽象工厂模式

学习设计模式的时候,提到了一个专门访问数据库的模式-抽象工厂模式,记得当时举例子理解的时候并未设计到数据库,只是大概了了解了一下,现在对于机房收费系统涉及到了数据库的管理,借此机会好好学习一下.用经常说的一句经典的话语则是:欠的债总是要还的,这句话同时也警告自己对于学习要一心一意,切勿粗心大意.       欢迎访问自己对于工厂三姐妹的理解 对比可以知道,对于抽象工厂模式的初步理解,则是 重构机房收费系统,对于数据库的选择方法则是在D层建立一个单独的类,来连接字符串.而在此使用工厂层,其主要作用

Easyui datebox单击文本框显示日期选择

Easyui默认是点击文本框后面的图标显示日期,为了更进一步优化体验 修改为单击文本框显示日期选择框 修改jquery.easyui.min.js(作者用的是1.3.6版本,其他版本或有区别) 可 ctrl+f 搜索 "_outerWidth():0" 在本行下面添加如下代码: // datebox单击文本框出现日期选择 start if ($(_83f).hasClass("datebox-f")) { _844.click(function() { _845.c

Easyui datebox单击文本框显示日期选择 eayui版本1.5.4.1

Easyui默认是点击文本框后面的图标显示日期,体验很不好,所以我想单击文本框就显示日期选择框,网上很多版本是1.3,1.4的,于是自己就比葫芦画瓢改了一个1.5.4.1的版本. 我参考了网上这个帖子,基本一样.只是1.5.4.1增加了一些代码,所以行号有些差异,并且编码后的数字有些变化.Easyui datebox单击文本框显示日期选择 eayui版本1.5.3 修改jQuery.easyui.min.js文件,在文件中查找:tb._size(opts, 保存,成功. 原文地址:https:/

vb.net机房收费 &amp; Register文本框为空提示,一键清空文本框所有内容

已经第二次机房收费系统重构了,一遍当然得有一遍的效果,正如对于文本框为空的提示方法,回顾第一遍机房,那些傻里傻气的If语句让自己对代码的亲和度大打折扣啊!那么到底有什么办法解决那些重复性的判断呢?这时候我们就要提到所谓的Model窗体了.在Model窗体中,建立一个封装数组,当窗体中需要判断大量文本框为空的时候,只需简单的调用即可. 新建一个Model类,来存放公共需要的部分. 1.定义一个结构体Term,且用结构体封装一个数组 Public Structure Term '定义结构体term

机房重构——泛型集合

敲三层的时候就听师傅说过泛型,只不过当时没有特别的注意.当敲用户登录窗体时,我遇到这样的问题,就是我们需要经过验证输入的信息的正误之后才能登录或者不能登录.判断时,需要返回我们从数据库中查到的信息,那么问题就来了,如何返回呢? 一开始我一直用的是DataTable返回数据的,但是当去判断的时候我不知道如何下手了,按照以往的经验,我们可以使用table.rows()或table.field(),具体的实现方法可以自己试验一下.这种方法虽然可以实现,可是里面重复的内容太多了,尤其是每次使用一个字段时