![C#项目开发全程实录(第4版)](https://wfqqreader-1252317822.image.myqcloud.com/cover/544/24172544/b_24172544.jpg)
1.8 房源设置模块设计
![](https://epubservercos.yuewen.com/64AA3F/13043251004879506/epubprivate/OEBPS/Images/Figure-P34_15301.jpg?sign=1739588595-9oom4m38xqKEytE9KTAUw6zuAzvqyeoM-0-317c8b4c0cb534025af1acadce93574f)
视频讲解
1.8.1 房源设置模块概述
房源设置模块用于设置房源的基本信息,它将多个基础表的信息和房源表的信息进行有机的结合。通过视图view_house把信息呈现给用户。本系统较为人性化的功能也在这里体现,即出租人在添加房源信息完毕时,程序通过存储过程proc_house_insert为出租人查找匹配的意向求租信息。如果有符合的信息,则会显示出来,出租人可以根据显示的求租信息找到合适的求租人,这样大大提高了工作效率。房源设置窗体运行结果如图1.23所示。
![](https://epubservercos.yuewen.com/64AA3F/13043251004879506/epubprivate/OEBPS/Images/Figure-P34_15297.jpg?sign=1739588595-Kzm6E9DtdyzL2lkIvY5MVcyrKPAW2aYE-0-5b865c8191de61e57cfc66ea8b94261b)
图1.23 房源设置窗体
1.8.2 房源设置模块技术分析
在房源设置窗体的最上方会显示房屋编号,该房屋编号的规则是:以字符串hou为编号前缀,加上4位数字作为编号的后缀,这4位数字从1001开始。例如,在添加第一个房源信息时,房屋编号就是hou1001,接下来的其他房屋编号会在上一个最大房屋编号的后缀的基础上进行流水递增,这样程序就需要取出已存在的最大房屋编号。那么,在SQL语句中,使用Max(house_ID)函数获取最大房屋编号,在C#程序中,使用SqlCommand实例的ExecuteScalar()方法获取该房屋编号。
ExecuteScalar()方法执行指定的SQL查询,并返回查询所返回的结果集中第一行的第一列。其语法格式如下:
public override object ExecuteScalar();
该方法返回结果集中第一行的第一列;如果结果集为空,则为空引用。例如,下面的示例代码通过ExecuteScalar()方法获取最大的房源编号。
![](https://epubservercos.yuewen.com/64AA3F/13043251004879506/epubprivate/OEBPS/Images/Figure-P34_52105.jpg?sign=1739588595-tEyxvN7hgOnStxUcyeAHya3C2D0HLbIc-0-9930cf2af5590c9071f02274582b25d5)
1.8.3 房源设置模块实现过程
本模块使用的数据表:tb_house
房源设置模块的具体实现步骤如下。
(1)新建一个Windows窗体,命名为frmHouse.cs,用于设置房屋信息,该窗体主要用到的控件及属性设置如表1.10所示。
表1.10 房源设置窗体主要用到的控件
![](https://epubservercos.yuewen.com/64AA3F/13043251004879506/epubprivate/OEBPS/Images/Figure-T35_51684.jpg?sign=1739588595-WCDMBqerQy7KLgNb6SyjXFjwyTHlmlGg-0-c42a48444b0f6740e11bb8283c5fe886)
(2)声明局部变量及公共类ClsCon的对象,通过该对象调用类中的方法,以实现数据库连接,实现代码如下:
例程18 代码位置:资源包\TM\01\houseAgency\SeekTenantsM\frmHouse.cs
![](https://epubservercos.yuewen.com/64AA3F/13043251004879506/epubprivate/OEBPS/Images/Figure-P35_52108.jpg?sign=1739588595-riGh063hZo1GvalTWko8Q80vlC3aBWho-0-bd6ab776d5274dc7a9097e60475e645b)
在frmHouse窗体的Load事件中,通过M_str_Show变量判断本次调用窗体的目地。如果是浏览或修改信息,则将相应的信息显示到控件上,如果是添加信息,则将基本表的信息绑定到ComboBox控件上。frmHouse窗体的Load事件中实现代码如下:
例程19 代码位置:资源包\TM\01\houseAgency\SeekTenantsM\frmHouse.cs
![](https://epubservercos.yuewen.com/64AA3F/13043251004879506/epubprivate/OEBPS/Images/Figure-P36_52110.jpg?sign=1739588595-UEswo8bgvTcNVOQ8eTcMXqLOcLyIzCOy-0-02b7437d71db97685de67ae52f85d949)
![](https://epubservercos.yuewen.com/64AA3F/13043251004879506/epubprivate/OEBPS/Images/Figure-P37_52111.jpg?sign=1739588595-aPccuc5TJGQ8WnZjzvTCnLxWzWrDBxKC-0-dbb9c04ad213b50268846e33ff59bc12)
代码贴士
❶ 通过判断M_str_Show变量是否为空初始化窗体,主要是初始化房源编号的值。
❷ 通过查询语句来生成命令对象。
❸ HasRows属性用于判断结果集中是否有记录。
输入房源信息时,为了保证建筑面积和单价信息的有效性,在TextBox的KeyPress事件中调用自定义IsNum()方法,该方法用来验证用户输入建筑面积和单价信息的合法性。自定义IsNum()方法的代码如下:
例程20 代码位置:资源包\TM\01\houseAgency\SeekTenantsM\frmHouse.cs
![](https://epubservercos.yuewen.com/64AA3F/13043251004879506/epubprivate/OEBPS/Images/Figure-P37_52114.jpg?sign=1739588595-v4KrY4YuBkBtHKcZg2sJ3slbtmaLdTTf-0-db96ad8d17380c165306562edf14580b)
注意
IsNum(object sender, KeyPressEventArgs e)方法内的参数,应该与TextBox控件的keyPress事件的参数对应。
在图1.23所示的窗体中单击“…”按扭进行更改相应的基础信息,在确认更改后,新的基础信息会立即加载到相应的ComboBox控件中。这里以“更改房型”为例,其实现代码如下:
例程21 代码位置:资源包\TM\01\houseAgency\SeekTenantsM\frmHouse.cs
![](https://epubservercos.yuewen.com/64AA3F/13043251004879506/epubprivate/OEBPS/Images/Figure-P38_52116.jpg?sign=1739588595-wPLeMxpfbaPNJVrhzJy1OSM6moBYoE6z-0-969267d506710bcc3f70241f12382154)
注意
语句“ft.ShowDialog() == DialogResult.OK”可以达到实时刷新主窗体的效果,这里以frmType窗体为例,要把frmType内的“确定”按钮的DialogResult的属性设为OK。
1.8.4 单元测试
在调试程序时,单击房型对应的“...”按钮,对房型信息进行添加、修改和删除操作后,虽然房型表的信息已更新,但并没有在房源设置窗体的“房型”下拉列表框中显示,只有重新打开房源设置窗体frmHouse,才可以看到更新后的房型信息,如图1.24~图1.26所示。
![](https://epubservercos.yuewen.com/64AA3F/13043251004879506/epubprivate/OEBPS/Images/Figure-P39_52117.jpg?sign=1739588595-5L9eOEY4Fd66rDTfv2LXz4jpACW6MqXQ-0-d63b0b894299498ab071ca7fd8347c69)
图1.24 房源设置窗体(修改前)
![](https://epubservercos.yuewen.com/64AA3F/13043251004879506/epubprivate/OEBPS/Images/Figure-P39_15647.jpg?sign=1739588595-Ohoswss6cBAy5ymFNYepnxdVHOas2Ek6-0-68f944c449ead9a4e4569fa5fdaae9ab)
![](https://epubservercos.yuewen.com/64AA3F/13043251004879506/epubprivate/OEBPS/Images/Figure-P39_52118.jpg?sign=1739588595-821OFdAkFlRyQUnFw3rtJVdHXbHumJxB-0-6fe2e5e52df51af73674784c87502a03)
图1.25 房型设置窗体
![](https://epubservercos.yuewen.com/64AA3F/13043251004879506/epubprivate/OEBPS/Images/Figure-P39_15647.jpg?sign=1739588595-Ohoswss6cBAy5ymFNYepnxdVHOas2Ek6-0-68f944c449ead9a4e4569fa5fdaae9ab)
![](https://epubservercos.yuewen.com/64AA3F/13043251004879506/epubprivate/OEBPS/Images/Figure-P39_52122.jpg?sign=1739588595-QgaRl43jK5pRlpdggx5LEX4YWbHwAEg9-0-fed7064e61134f43a91a3cd9b1c9dbff)
图1.26 房源设置窗体(修改后)
原房型按钮“...”Click事件的相关代码如下:
![](https://epubservercos.yuewen.com/64AA3F/13043251004879506/epubprivate/OEBPS/Images/Figure-P39_52124.jpg?sign=1739588595-ErjKYzvE8t6T7npcUx3exSbqOtdcZj4R-0-c69d3bd9b1ced7890274eecb5a451910)
经过分析后发现,该错误在于无法在图1.25所示房型设置窗体操作完毕后马上调用flushtype()方法,虽然房型表的信息已更新,但下拉列表框绑定的仍是未更新前的数据集。为了及时更新数据集,将图1.25中房型设置窗体的“确定”按扭的DialogResult属性设为OK,这样房型设置窗体就作为图1.26房源设置窗体的一部分,当房型信息更新后,房源设置窗体便可以通过flushtype()方法重新生成数据集,然后再绑定到“房型”下拉列表框中。修改后的房型按钮“…”的Click事件代码如下:
![](https://epubservercos.yuewen.com/64AA3F/13043251004879506/epubprivate/OEBPS/Images/Figure-P40_52126.jpg?sign=1739588595-mYvgWGc6efN3ShVHjk7gK0V4c58BcENF-0-bd8ddce1da5c20a41cd2f98ad5d0c087)