购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

第1章
房屋中介管理系统
(C#+SQL Server 2014实现)

随着信息技术的日益发展,作为房屋中介公司的工作人员,希望通过使用计算机来代替烦琐和大量的手工操作,以便达到事半功倍的效果,这样就能够使房屋中介对求租人信息、出租人信息和房源信息的管理实现系统化、规范化及自动化。本章将通过使用C#+SQL Server 2014技术开发一个房屋中介管理系统。

通过阅读本章,读者可以学习到:

数据的定位查询和模糊查询

如何进行严格的数据检验

如何图形化显示房源信息

如何使用存储过程

如何实现断开式数据库连接

如何使用图标显示房屋状态

配置说明

1.1 开发背景

视频讲解

房屋中介管理系统是房屋中介机构不可缺少的一部分,能够为操作人员和用户提供充足的信息和快速查询手段。但一直以来人们使用传统人工的方式管理房屋出租、求租等房屋信息,这种管理存在着许多缺点,如效率低、保密性差等,时间一长,将产生大量的文件和数据,这样给查找、更新和维护房屋信息带来了不少的困难,而房屋中介管理系统的出现改变了这一现状,它是一款非常实用的房屋中介管理软件,使用该软件,不仅可以详细地记录房源信息和用户信息等,同时还能够自动查找和客户需求相匹配的房源,在方便客户的同时又提高了使用者的工作质量和效率。

1.2 需求分析

通过与×××房屋中介公司的沟通和需求分析,要求系统具有以下功能。

由于操作人员的计算机知识有限,因此要求系统具有良好的人机界面。

如果系统的使用对象较多,则要求有较好的权限管理。

方便的数据查询,支持自定义条件查询。

自动匹配房源和求房意向信息。

使用垃圾信息处理机制释放空间。

在相应的权限下,可方便地删除数据。

数据计算自动完成,尽量减少人工干预。

1.3 系统设计

1.3.1 系统目标

本系统属于小型的数据库系统,可以对房源和租赁人等进行有效的管理。通过本系统可以达到以下目标。

系统采用人机交互方式,界面美观友好,信息查询灵活、方便,数据存储安全可靠。

灵活的批量录入数据,使信息传递更快捷。

实现垃圾信息清理。

实现后台监控功能。

实现各种查询,如定位查询、模糊查询等。

实现图形化显示房源信息。

对用户输入的数据,进行严格的数据检验,尽可能避免人为错误。

系统最大限度地实现了易安装性、易维护性和易操作性。

1.3.2 系统功能结构

房屋中介管理系统功能结构如图1.1所示。

图1.1 系统功能结构图

1.3.3 业务流程图

房屋中介管理系统的业务流程如图1.2所示。

图1.2 房屋中介管理系统业务流程图

1.3.4 业务逻辑编码规则

遵守程序编码规则所开发的程序,代码清晰、整洁、方便阅读,并可以提高程序的可读性,真正做到“见其名知其意”。本节从数据库设计和程序编码两个方面介绍程序开发中的编码规则。

1.数据库对象命名规则

(1)数据库命名规则

数据库命名以字母db开头(小写),后面加数据库相关英文单词或缩写。下面将举例说明,如表1.1所示。

表1.1 数据库命名

注意

在设计数据库时,为使数据库更容易理解,数据库命名时要注意大小写。

(2)数据表命名规则

数据表命名以字母tb开头(小写),后面加数据库相关英文单词或缩写和数据表名,多个单词间用“_”分隔。下面将举例说明,如表1.2所示。

表1.2 数据表命名

(3)字段命名规则

字段一律采用英文单词或词组(可利用翻译软件)命名,如找不到专业的英文单词或词组,可以用相同意义的英文单词或词组代替,另外,单词或单词缩写之间可以使用“_”分隔。下面将举例说明,如表1.3所示为库存信息表中的部分字段。

表1.3 字段命名

2.业务编码规则

(1)员工编号

员工编号是房屋中介管理系统中员工的唯一标识,不同的员工可以通过该编号来区分(即使员工名称相同)。在本系统中该编号的命名规则:以字符串emp为编号前缀,加上4位数字作为编号的后缀,这4位数字从1001开始。例如,emp1001。

(2)客户编号

客户编号是房屋中介管理系统中客户的唯一标识,对于中介机构,它的客户分为出租人和求租人两类,不同的客户可以通过该编号来区分(即使客户名称相同)。在本系统中该编号的命名规则:以字符串want(标识求租人)或lend(标识出租人)为编号前缀,加上4位数字作为编号的后缀,这4位数字从1001开始。例如,lend1006或want1005。

(3)房屋编号

房屋编号是房屋中介管理系统中房源的唯一标识,它用于唯一标识某一套具体的出租房屋。在本系统中该编号的命名规则:以字符串hou为编号前缀,加上4位数字作为编号的后缀,这4位数字从1001开始。例如,hou1001。

1.3.5 程序运行环境

本系统的程序运行环境具体如下。

系统开发平台:Microsoft Visual Studio 2017。

系统开发语言:C#。

数据库管理系统软件:SQL Server 2014。

运行平台:Windows 7(SP1)/Windows 8/Windows 10。

运行环境:Microsoft.NET Framework SDK v4.7。

1.3.6 系统预览

房屋中介管理系统由多个窗体组成,下面仅列出几个典型窗体,其他窗体参见资源包中的源程序。

主窗体如图1.3所示,主要实现快速链接系统的所有功能,该窗体提供两种打开子窗体的菜单,既可以通过最上面的常规菜单打开系统中的所有子窗体;也可以通过窗体左面的树型菜单来打开系统中的所有子窗体。

图1.3 主窗体(资源包\…\frmMain.cs)

求租人员信息窗体如图1.4所示,主要实现登记求租人信息,注意“手机号码”和“身份证号码”必须输入,以备后面的操作之用。出租人信息设置窗体如图1.5所示,主要是完成出租人信息登记和所要出租的房屋登记。这两个窗体使用同一个类文件,即frmPeopleInfo.cs文件,程序根据打开的命令不同,显示或隐藏“录入房源”按钮。

图1.4 求租人窗体(资源包\…\UserInfor\frmPeopleInfo.cs)

房屋状态查询窗体如图1.6所示,主要实现查询房屋的状态,房屋的状态包括已租、未租和预订3种状态。另外,还可以通过手机号进行预订房屋和取消预订两种操作。

图1.5 出租人窗体(资源包\…\UserInfor\frmPeopleInfo.cs)

图1.6 房屋状态查询窗体(资源包\…\SeekTenantsM\frmStateHouse.cs)

说明

省略的路径是TM\01\houseAgency。

1.4 数据库设计

视频讲解

1.4.1 数据库概要说明

本系统采用SQL Server 2014作为后台数据库,数据库名称为db_House,其中包含15张数据表,详细情况如图1.7所示。

图1.7 房屋中介管理系统中用到的数据表

1.4.2 数据库概念设计

本系统中规划出的实体主要有员工信息实体、客户信息实体、房源实体和求租意向实体等。

员工信息实体E-R图,如图1.8所示。客户信息实体E-R图,如图1.9所示。

房源实体E-R图,如图1.10所示。求租意向实体E-R图,如图1.11所示。

费用信息实体E-R图,如图1.12所示。朝向信息实体E-R图,如图1.13所示。

图1.8 员工信息实体E-R图

图1.9 客户信息实体E-R图

图1.10 房源实体E-R图

图1.11 求租意向实体E-R图

图1.12 费用信息实体E-R图

图1.13 朝向信息实体E-R图

1.4.3 数据库逻辑设计

由于篇幅所限,下面对比较重要的数据表的结构进行介绍。

(1)tb_employee(员工信息表)

tb_employee表用于保存员工的基本信息,该表的结构如表1.4所示。

表1.4 员工信息表

(2)tb_User(客户信息表)

tb_User表用于保存客户信息,该表的结构如表1.5所示。

表1.5 客户信息表

(3)tb_house(房源信息表)

tb_house表用于保存房源信息,该表的结构如表1.6所示。

表1.6 房源信息表

(4)tb_intent(求租意向表)

tb_intent表用于保存求租人对房源的要求信息,该表的结构如表1.7所示。

表1.7 求租意向表

1.5 公共类设计

视频讲解

在开发项目中以类的形式来组织、封装一些常用的方法和事件,不仅可以提高代码的重用率,也大大方便了代码的管理。本系统中创建了公共类ClsCon.cs,并且还为每个数据表建立了自己的实体类和方法类。在此只介绍一张数据表所对应的实体类和方法类,其他数据表所对应的类,可参见本书资源包中的源程序。

1.5.1 程序文件架构

主文件架构如图1.14所示。

员工信息和用户信息管理文件架构如图1.15和图1.16所示。

求租管理和常用工具文件架构如图1.17和图1.18所示。

图1.14 主文件架构图

图1.15 员工信息管理文件架构图

图1.16 用户信息管理文件架构图

图1.17 求租管理文件架构图

出租管理文件架构如图1.19所示。系统管理文件架构如图1.20所示。

图1.18 常用工具文件架构图

图1.19 出租管理文件架构图

图1.20 系统管理文件架构图

1.5.2 ClsCon类

ClsCon主要用于创建数据库连接及关闭打开的数据连接,需要引入System.Data和System.Data.SqlClient两个命名空间,其关键代码如下:

例程01 代码位置:资源包\TM\01\houseAgency\mothedCls\ClsCon.cs

接下来,对上面代码中的自定义方法进行详细介绍。

1.ConDatebase()方法

ConDatebase()方法用于建立数据库连接,其实现代码如下:

例程02 代码位置:资源包\TM\01\houseAgency\mothedCls\ClsCon.cs

2.closeCon()方法

closeCon()方法实现关闭打开的数据库连接,其实现代码如下:

例程03 代码位置:资源包\TM\01\houseAgency\mothedCls\ClsCon.cs

1.5.3 clsFavor类

clsFavor实体类将tb_favor数据表的字段通过GET、SET访问器封装起来,其实现代码如下:

例程04 代码位置:资源包\TM\01\houseAgency\mothedCls\ClsFavor.cs

说明

在定义实体类时可以为其属性指定默认值,这样可减轻前台的负担。

1.5.4 claFavorMethod类

claFavorMethod类封装了对tb_favor数据表进行插入、修改和删除等操作的方法,由于封装的这3种方法在实现技术上类似,所以这里只介绍对tb_favor表进行插入操作的方法—insert_table()方法。

insert_table()方法首先通过实体类取出信息,然后调用数据库中的存储过程来得到执行结果,最后把执行结果传递给表示层,其实现代码如下:

例程05 代码位置:资源包\TM\01\houseAgency\mothedCls\ClsFavorMethod.cs

代码贴士

❶ 为SqlCommand指定要调用的存储过程名proc_favor_insert。

❷ 定义CommandType为StoredProcedure存储过程。

❸ 通过SqlParameter数组为SqlCommand定义参数,同时指定大小类型等,参数名要与存储过程中的参数名相同。

❹ 初始化SqlParameter类的一个新实例,该类使用参数名、参数的类型、参数的长度、方向、精度、小数位数、源列名称、DataRowVersion值之一、用于源列映射的布尔值、SqlParameter的值、此XML实例的架构集合所在的数据库的名称、此XML实例的架构集合所在的关系架构以及此参数的架构集合的名称。

❺ 获得存储过程的返回值。

1.6 主窗体设计

视频讲解

1.6.1 主窗体概述

主窗体是程序操作过程中必不可少的,它是人机交互中的重要环节,用户通过主窗体可以快速打开系统中相关的各个子模块。本系统的主窗体被分为4个部分:最上面是系统菜单栏,可以通过它调用系统中的所有子窗体;菜单栏下面是工具栏,以按钮的形式调用最常用的子窗体;窗体的左面是一个树型列表,可以通过它显示系统的所有功能;窗体的右面是一个和程序主题相关的背景图片;窗体的最下面,用状态栏显示当前登录的用户名及系统时间。主窗体运行结果如图1.21所示。

图1.21 主窗体

1.6.2 主窗体技术分析

本系统在窗体的左侧使用树型控件(TreeView)显示系统的所有菜单项,通过单击这些菜单项,同样可以打开相应的窗体。这种树型菜单相比传统的横向菜单更加方便和易于操作,下面将介绍在本模块中用到的TreeView控件的相关知识。

1.创建TreeView控件的根节点

在树型菜单中,根节点显示系统主菜单的内容,那么如何将主菜单的内容添加到TreeView控件中呢?这可以通过调用TreeView控件的Nodes属性的Add()方法来实现,该方法的重载形式有多种,本模块用到的语法格式如下:

    public virtual TreeNode Add(string text);

text:节点显示的标签文本。

返回值:添加的节点实例。

该Add()方法实现将具有指定标签文本的新树节点添加到当前树节点集合的末尾。

例如,下面的示例代码实现向TreeView控件添加3个表示年级的节点。

    TreeNode node1 = treeView1.Nodes.Add("一年级");
    TreeNode node2 = treeView1.Nodes.Add("二年级");
    TreeNode node3 = treeView1.Nodes.Add("三年级");
2.创建根节点的子节点

在树型菜单中,需要在每个根节点下添加子菜单项,这可以通过调用根节点实例的Nodes属性的Add()方法来实现,该方法与上面介绍的Add()方法是同一个方法,这里不再赘述。

1.6.3 主窗体实现过程

主窗体的具体实现步骤如下。

(1)新建一个Windows窗体,命名为frmUserLogin.cs,它主要用作房屋中介管理系统的主窗体,该窗体主要用到的控件及属性设置如表1.8所示。

表1.8 主窗体主要用到的控件

(2)声明局部变量及公共类ClsCon对象,通过ClsCon对象调用类中的方法,以实现数据库连接,代码如下:

例程06 代码位置:资源包\TM\01\houseAgency\frmMain.cs

在frmMain窗体的Load事件中,获取登录用户的名称及权限,并通过权限设置“员工信息”菜单的显示状态,然后调用自定义方法GetMenu()将菜单中的各命令项按照层级关系动态添加到TreeView控件中。frmMain窗体的Load事件代码如下:

例程07 代码位置:资源包\TM\01\houseAgency\frmMain.cs

GetMenu()方法是一个无返回值的自定义方法,它的主要功能是遍历MenuStrip控件的菜单项,然后将各菜单项按照层级关系添加到TreeView控件中。该方法关键代码如下:

例程08 代码位置:资源包\TM\01\houseAgency\frmMain.cs

因为本系统即可以在菜单栏中打开子窗体,又可以在树型列表中打开窗体,所以必要设置一个自定义方法frm_show(),通过各菜单项或节点的Tag属性值来打开相应的窗体。代码如下:

例程09 代码位置:资源包\TM\01\houseAgency\frmMain.cs

下面用“求租人员信息”命令的单事件为例,来说明如何用自定义方法frm_show()来调用相应的子窗体。“求租人员信息”命令的Click事件关键代码如下:

例程10 代码位置:资源包\TM\01\houseAgency\frmMain.cs

1.7 用户信息管理模块设计

视频讲解

1.7.1 用户信息管理模块概述

用户信息管理模块主要用于管理用户信息。其中包括两种用户类型,即出租方和求租方。如果出租方仅仅提供个人基本信息而没有提供房源信息,则可以通过本系统提供的垃圾信息清理机制将其清除。用户信息管理窗体运行结果如图1.22所示。

图1.22 用户信息管理窗体

1.7.2 用户信息管理模块技术分析

本模块提供了查询“出租人”和“求租人”的功能,并且可以通过设置多个查询条件来查询,这就需要动态设置具有查询功能的SQL语句,本实例使用StringBuilder类的Append()方法来实现动态连接SQL语句,该方法的重载形式有多种,本模块用到的语法格式如下:

    public StringBuilder Append(string value);

value:要追加的字符串。

返回值:完成追加操作后对StringBuilder类型实例的引用。

该Append()方法实现在StringBuilder类型实例的结尾追加指定字符串的副本。

例如,下面的代码实现根据客户编号、客户名称、客户电话号码等多个条件实现动态查询“求租人”或“出租人”记录。

1.7.3 用户信息管理模块实现过程

本模块使用的数据表:tb_User

用户信息管理模块的具体实现步骤如下。

(1)新建一个Windows窗体,命名为frmPeopleList.cs,用于设置用户信息。该窗体主要用到的控件及属性设置如表1.9所示。

表1.9 用户信息管理窗体主要用到的控件

(2)声明局部变量及公共类ClsCon的对象,通过该对象调用类中的方法,以实现数据库连接,代码如下:

例程11 代码位置:资源包\TM\01\houseAgency\UserInfor\frmPeopleList.cs

在frmPeopleList窗体的Load事件中,通过调用自定义ListInfo()方法对DataGridView控件进行数据绑定,显示所有系统用户信息。窗体Load事件的关键代码如下:

例程12 代码位置:资源包\TM\01\houseAgency\UserInfor\frmPeopleList.cs

代码贴士

❶ 在加载时为StringBuilder对象sbSql赋初值。

❷ 在加载时控制选项卡中的TextBox控件。

自定义UnAble()方法,主要用来批量设置容器控件中相关控件的Enabled属性。代码如下:

例程13 代码位置:资源包\TM\01\houseAgency\UserInfor\frmPeopleList.cs

自定义ListInfo()方法,该方法接受查询语句,用来将查询结果绑定到ListView控件。代码如下:

例程14 代码位置:资源包\TM\01\houseAgency\UserInfor\frmPeopleList.cs

单击listView控件中的任一单元格,将对应的详细客户信息显示在相应选项卡的文本框中。实现代码如下:

例程15 代码位置:资源包\TM\01\houseAgency\UserInfor\frmPeopleList.cs

当用户选择“出租人”选项卡或“求租人”选项卡时,在相应的选项卡页中显示客户信息。实现代码如下:

例程16 代码位置:资源包\TM\01\houseAgency\UserInfor\frmPeopleList.cs

单击“删除”按钮,删除相关的客户信息,同时自动调用触发器trig_delete_tbUser,删除出租人所提供的房源信息。程序中实现代码如下:

例程17 代码位置:资源包\TM\01\houseAgency\UserInfor\frmPeopleList.cs

说明

有关触发器的代码可参见本书资源包。

1.8 房源设置模块设计

视频讲解

1.8.1 房源设置模块概述

房源设置模块用于设置房源的基本信息,它将多个基础表的信息和房源表的信息进行有机的结合。通过视图view_house把信息呈现给用户。本系统较为人性化的功能也在这里体现,即出租人在添加房源信息完毕时,程序通过存储过程proc_house_insert为出租人查找匹配的意向求租信息。如果有符合的信息,则会显示出来,出租人可以根据显示的求租信息找到合适的求租人,这样大大提高了工作效率。房源设置窗体运行结果如图1.23所示。

图1.23 房源设置窗体

1.8.2 房源设置模块技术分析

在房源设置窗体的最上方会显示房屋编号,该房屋编号的规则是:以字符串hou为编号前缀,加上4位数字作为编号的后缀,这4位数字从1001开始。例如,在添加第一个房源信息时,房屋编号就是hou1001,接下来的其他房屋编号会在上一个最大房屋编号的后缀的基础上进行流水递增,这样程序就需要取出已存在的最大房屋编号。那么,在SQL语句中,使用Max(house_ID)函数获取最大房屋编号,在C#程序中,使用SqlCommand实例的ExecuteScalar()方法获取该房屋编号。

ExecuteScalar()方法执行指定的SQL查询,并返回查询所返回的结果集中第一行的第一列。其语法格式如下:

    public override object ExecuteScalar();

该方法返回结果集中第一行的第一列;如果结果集为空,则为空引用。例如,下面的示例代码通过ExecuteScalar()方法获取最大的房源编号。

1.8.3 房源设置模块实现过程

本模块使用的数据表:tb_house

房源设置模块的具体实现步骤如下。

(1)新建一个Windows窗体,命名为frmHouse.cs,用于设置房屋信息,该窗体主要用到的控件及属性设置如表1.10所示。

表1.10 房源设置窗体主要用到的控件

(2)声明局部变量及公共类ClsCon的对象,通过该对象调用类中的方法,以实现数据库连接,实现代码如下:

例程18 代码位置:资源包\TM\01\houseAgency\SeekTenantsM\frmHouse.cs

在frmHouse窗体的Load事件中,通过M_str_Show变量判断本次调用窗体的目地。如果是浏览或修改信息,则将相应的信息显示到控件上,如果是添加信息,则将基本表的信息绑定到ComboBox控件上。frmHouse窗体的Load事件中实现代码如下:

例程19 代码位置:资源包\TM\01\houseAgency\SeekTenantsM\frmHouse.cs

代码贴士

❶ 通过判断M_str_Show变量是否为空初始化窗体,主要是初始化房源编号的值。

❷ 通过查询语句来生成命令对象。

❸ HasRows属性用于判断结果集中是否有记录。

输入房源信息时,为了保证建筑面积和单价信息的有效性,在TextBox的KeyPress事件中调用自定义IsNum()方法,该方法用来验证用户输入建筑面积和单价信息的合法性。自定义IsNum()方法的代码如下:

例程20 代码位置:资源包\TM\01\houseAgency\SeekTenantsM\frmHouse.cs

注意

IsNum(object sender, KeyPressEventArgs e)方法内的参数,应该与TextBox控件的keyPress事件的参数对应。

在图1.23所示的窗体中单击“…”按扭进行更改相应的基础信息,在确认更改后,新的基础信息会立即加载到相应的ComboBox控件中。这里以“更改房型”为例,其实现代码如下:

例程21 代码位置:资源包\TM\01\houseAgency\SeekTenantsM\frmHouse.cs

注意

语句“ft.ShowDialog() == DialogResult.OK”可以达到实时刷新主窗体的效果,这里以frmType窗体为例,要把frmType内的“确定”按钮的DialogResult的属性设为OK。

1.8.4 单元测试

在调试程序时,单击房型对应的“...”按钮,对房型信息进行添加、修改和删除操作后,虽然房型表的信息已更新,但并没有在房源设置窗体的“房型”下拉列表框中显示,只有重新打开房源设置窗体frmHouse,才可以看到更新后的房型信息,如图1.24~图1.26所示。

图1.24 房源设置窗体(修改前)

图1.25 房型设置窗体

图1.26 房源设置窗体(修改后)

原房型按钮“...”Click事件的相关代码如下:

经过分析后发现,该错误在于无法在图1.25所示房型设置窗体操作完毕后马上调用flushtype()方法,虽然房型表的信息已更新,但下拉列表框绑定的仍是未更新前的数据集。为了及时更新数据集,将图1.25中房型设置窗体的“确定”按扭的DialogResult属性设为OK,这样房型设置窗体就作为图1.26房源设置窗体的一部分,当房型信息更新后,房源设置窗体便可以通过flushtype()方法重新生成数据集,然后再绑定到“房型”下拉列表框中。修改后的房型按钮“…”的Click事件代码如下:

1.9 房源信息查询模块设计

视频讲解

1.9.1 房源信息查询模块概述

房源信息查询是房屋中介系统中重要的功能之一,它主要根据物业名称、楼层、价格、面积、朝向等条件进行查询,并且部分字段支持模糊查询。

房源信息查询窗体运行结果如图1.27所示。

图1.27 房源信息查询窗体

1.9.2 房源信息查询模块技术分析

房源信息查询窗体是将本窗体中的各个查询条件组合为SQL查询语句,然后在指定的数据表中进行查询。

下面对SQL的查询语句进行详细说明。

    SELECT select_list [ FROM table_source ][ WHERE search_condition ]

select_list:数据表中的字段名称,可以用*表示所有字段。

table_source:数据表名称。

search_condition:条件表达式。

本模块应用SqlDataAdapter对象来执行SQL查询语句,其语法格式如下:

    SqlDataAdapter(string selectCommandText, SqlConnection selectConnection);

selectCommandText:SQL语句。

selectConnection:表示SQL Server数据库的一个打开连接。

下面用SqlDataAdapter对象实现一个简单的数据表查询功能。代码如下:

1.9.3 房源信息查询模块实现过程

(1)新建一个Windows窗体,命名为frmSelect.cs,用于查询房源信息,该窗体主要用到的控件及属性设置如表1.11所示。

表1.11 房源信息查询窗体主要用到的控件

(2)声明局部变量及公共类ClsCon的对象,通过ClsCon的对象调用类中的方法,用于实现数据库连接,实现代码如下:

例程22 代码位置:资源包\TM\01\houseAgency\SeekTenantsM\frmSelect.cs

代码贴士

❶ 定义局部变量strSql,用于存放生成的SQL语句。

❷ 定义局部变量strMidle,用于存放要查询的字段。

❸ 定义局部变量strWhere,用于存放生成SQL语句的条件信息。

❹ 定义连接对象。

在frmSelect窗体的Load事件中,DataGridView控件进行数据绑定,以显示房源相关信息。frmSelect窗体的Load事件实现代码如下:

例程23 代码位置:资源包\TM\01\houseAgency\SeekTenantsM\frmSelect.cs

通过选择CheckBox控件生成查询条件语句,每个CheckBox控件对应房源表中相关的字段。这里只列举一个字段的生成,其他相关字段生成可参见本书资源包中的源程序。实现代码如下:

例程24 代码位置:资源包\TM\01\houseAgency\SeekTenantsM\frmSelect.cs

代码贴士

❶ strMidle变量用于记录要操作的字段,并通过@作为分隔字符。在下面查询按钮中,通过Split()系统函数对strMidle变量进行操作。

单击“查询”按钮,对strMidle变量进行相关处理,动态生成SQL语句。这里列出部分代码,其他可参见本书资源包中的源程序。

例程25 代码位置:资源包\TM\01\houseAgency\SeekTenantsM\frmSelect.cs

代码贴士

❶ strMidle变量用于记录要查询的字段,@作为分隔字符,通过Split()系统函数对strMidle变量进行操作,得到查询字段列表。

❷ 判断是否要进行查询操作。

❸ 通过Replace()系统函数改变strMidle变量以便得到正确的Where条件。

❹ 进行判断SQL语句是否合法。

❺ 将变量strWhere设置为string.Empty。

❻ 将strSql对象通过Remove()方法清空。

1.10 房源状态查询模块设计

视频讲解

1.10.1 房源状态查询模块概述

房源状态查询窗体主要完成房源状态的查看,同时提供预订和取消预订的功能。房源状态以图标形式显示,灵活地运用了ListView控件的View属性。使用这种方式显示房源状态,为操作人员提供了更方便的查看方式,并且该模块还为客户提供了预约和取消预约房源的机会,从而留给客户更多的思考空间,又一次体现出本系统人性化的设计思想。房屋状态查询窗体如图1.28所示。

图1.28 房源状态查询窗体

1.10.2 房源状态查询模块技术分析

在房源状态查询窗体中,使用ListView控件来显示房源的状态,对于不同状态的房源(如已租、未租、预订),ListView控件会显示不同的图标,这样就使查看房源状态更方便。另外,ListView控件还可以显示多种视图模式,这样就使得数据项的查看方式更加丰富,下面将介绍如何为ListView控件添加图标。

1.ListView的图像列表属性和视图模式

ListView控件有3个图像列表属性,即LargeImageList、SmallImageList和StateImageList。List视图模式、Details视图模式、SmallIcon视图模式将显示SmallImageList属性所指定的图像列表中的图像。LargeIcon视图模式、Tile视图将显示LargeImageList属性所指定的图像列表中的图像。列表视图还可以在大图标或小图标旁显示StateImageList属性中设置的一组附加图标。

2.通过编写代码为ListView控件添加图标

首先在ImageList控件中添加图标,然后将ListView控件的某个图像列表属性(如SmallImageList属性)设置为ImageList控件的实例,最后设置ListView控件的视图模式(如View.Details模式)。例如,下面的代码实现向ListView控件添加图标。

3.通过属性窗口设置ListView控件的图标

除了通过编码可以实现为ListView控件添加图标外,还可以通过在ListView控件的属性窗口中设置相关属性来实现添加图标,具体步骤如下:

(1)设置ListView控件的View属性为某种视图模式(Details、List、Tile等)。

(2)根据上面设置的视图模式,将ListView控件的相应图像列表属性(SmallImageList、LargeImageList或StateImageList)设置为想要使用的现有ImageList控件。

(3)为每个具有关联图标的列表项设置ImageIndex属性或StateImageIndex属性,这个设置可以在“ListViewItem集合编辑器”中进行(在ListView控件的“属性”窗口中,单击Items属性旁的“…”按钮,可以打开“ListViewItem集合编辑器”)。

1.10.3 房源状态查询模块实现过程

本模块使用的数据表:tb_house、tb_User

房源状态查询模块的具体实现步骤如下。

(1)新建一个Windows窗体,命名为frmStateHouse.cs,用于查看房屋状态、预订和取消预定房屋。该窗体主要用到的控件及属性设置如表1.12所示。

表1.12 房源状态查询窗体主要用到的控件

(2)声明局部变量和公共类ClsCon的对象,通过ClsCon的对象调用类中的方法,实现数据库连接,代码如下:

例程26 代码位置:资源包\TM\01\houseAgency\SeekTenantsM\frmStateHouse.cs

在frmStateHouse窗体的Load事件中,进行数据绑定,以显示房源状态相关信息。frmStateHouse窗体的Load事件实现代码如下:

例程27 代码位置:资源包\TM\01\houseAgency\SeekTenantsM\frmStateHouse.cs

房屋中介系统提供了房屋3种状态的表现形式,即“闲置”、“预定”和“出租”,主要通过ListInfo()方法显示房屋不同状态的图标。该功能的实现代码如下:

例程28 代码位置:资源包\TM\01\houseAgency\SeekTenantsM\frmStateHouse.cs

代码贴士

❶ 通过froeach()语句读取DataTable对象内的信息。

❷ 房源处于闲置状态。

❸ 房源处于预定状态。

❹ 房源处于出租状态。

❺ 将istViewItem对象lv添加到listView控件的items集合中,以显示查询结果。

设置房源显示模式的代码如下:

例程29 代码位置:资源包\TM\01\houseAgency\SeekTenantsM\frmStateHouse.cs

注意

要将ImagList控件和ListView控件绑定,需要将ImagList控件的StateImageList、SmallImageList和LargeImageList属性同ListView控件绑定,另外还要将ShowGroups属性设置为true,这样才能达到想要的效果。

用户可以通过输入手机号码预订或取消预订房源信息,在txtPhone控件中按下回车键时,判断用户是否有权享有这两项功能。该功能的实现代码如下:

例程30 代码位置:资源包\TM\01\houseAgency\SeekTenantsM\frmStateHouse.cs

代码贴士

❶ 查找是否存在与输入电话相符的求租人信息。

❷ 提示客户可以预订房源。

❸ 没有找到求租人信息。

❹ 选取手机号码文本框并获得焦点,等待用户再次输入。

注意

通过Select()方法和Focus()方法的并用,可以将所有信息选中并获得焦点,例如下面的代码:

    this.textBox1.Select(0, this.textBox1.Text.Length)
    this.textBox1.Focus();

1.11 员工信息设置模块设计

视频讲解

1.11.1 员工信息设置模块概述

员工信息设置模块主要用于管理员工信息。例如给不同的员工分配系统的使用权限和工资等。当添加新员工时,通过触发器trig_insetOfEmployeeinLogin将其添加到系统用户表中,并且将密码及权限进行初始化。例如密码统一为111,权限为普通员工。

员工设置信息窗体如图1.29所示。

图1.29 员工信息设置窗体

1.11.2 员工信息设置模块技术分析

员工信息设置模块在实现时,用到了触发器,使用触发器可以自动将添加的新员工信息添加到系统用户表中,触发器是在SQL Server中依附于某个表编写的,代码中不用调用,它会自动执行。员工信息设置模块中用到的触发器依附于tb_employee数据表,名称为trig_insetOfEmployeeinLogin,代码如下:

1.11.3 员工信息设置模块实现过程

员工信息设置模块的实现步骤如下。

(1)新建一个Windows窗体,命名为frmEmpleeyAll.cs,用于实现修改、删除和查看员工信息的功能,该窗体主要用到的控件及属性设置如表1.13所示。

表1.13 员工信息设置窗体主要用到的控件

(2)声明局部变量及公共类ClsCon的对象,通过ClsCon的对象调用类中的方法,实现数据库连接,代码如下:

例程31 代码位置:资源包\TM\01\houseAgency\StaffInfor\frmEmpleeyAll.cs

在frmEmpleeyAll.cs窗体的Load事件中,通过调用自定义showAll()方法对dataGridView控件员工信息进行绑定。frmEmpleeyAll窗体的Load事件关键代码如下:

例程32 代码位置:资源包\TM\01\houseAgency\StaffInfor\frmEmpleeyAll.cs

当用户单击DataGridView表格时,将表格中的员工信息显示在相应的文本框中,如图1.29所示,以上过程需要在DataGridView控件的SelectionChanged事件下完成。代码如下:

例程33 代码位置:资源包\TM\01\houseAgency\StaffInfor\frmEmpleeyAll.cs

自定义selectInfo()方法,主要用来显示员工详细信息,代码如下:

例程34 代码位置:资源包\TM\01\houseAgency\StaffInfor\frmEmpleeyAll.cs

代码贴士

❶ 取出员工编号。

❷ 查询对应员工编号的员工信息。

❸ 取出查询结果。

❹ 判断员工权根,0为员工,1为经理。

单击“确定”按钮,通过视图和INSTEAD OF触发器并用,完成员工信息表和登录表的更新操作。代码如下:

例程35 代码位置:资源包\TM\01\houseAgency\StaffInfor\frmEmpleeyAll.cs

代码贴士

❶ 为权限赋值,员工为0,经理为1。

❷ 为工资赋值,将信息转换成float型。

❸ 更新视图,改变员工信息。

❹ 重新刷新信息。

1.12 文件清单

为了帮助读者了解房屋中介管理系统的文件构成,现以表格形式列出程序的主要文件清单,如表1.14所示。

表1.14 程序文件清单

1.13 开发技巧与难点分析

直接对视图对象进行操作时,如果没有instead of触发器是无法操作的,如果视图是由多个表组成的,依次对每个表进行操作很麻烦,而且出错的可能性很大,而通过下面的代码便可以很轻松地解决。例如,trig_update_OfEmployee是一个update触发器,针对由员工表和登录表组成的视图view_empleey进行修改操作,其代码如下:

1.14 本章总结

优秀的应用系统软件须具备健壮性、灵活性以及良好的人性化界面。人性化可以让系统操作员快速熟悉系统。本系统中的房源状态查询模块体现了这一特点,不同状态的房屋在浏览时显示出不同的图标,这样操作人员会对查询结果一目了然。同时为了方便数据的浏览,还提供多种房源状态查看方式。在此提醒读者应灵活运用每种控件,以方便用户的操作和使用。 aEslKtj3zAy2BaIRV9mebh7XLlqPVQmoAhcq7l+u3Kgum8vVxcDcgavUHUeaYVTf

点击中间区域
呼出菜单
上一章
目录
下一章
×