![C#项目开发全程实录(第4版)](https://wfqqreader-1252317822.image.myqcloud.com/cover/544/24172544/b_24172544.jpg)
1.6 主窗体设计
![](https://epubservercos.yuewen.com/64AA3F/13043251004879506/epubprivate/OEBPS/Images/Figure-P23_14737.jpg?sign=1739289271-nOAVDsGvTMJQljf7ciCVM1d5F58rvyut-0-86e4ddeb28b0420a93d87890139e208c)
视频讲解
1.6.1 主窗体概述
主窗体是程序操作过程中必不可少的,它是人机交互中的重要环节,用户通过主窗体可以快速打开系统中相关的各个子模块。本系统的主窗体被分为4个部分:最上面是系统菜单栏,可以通过它调用系统中的所有子窗体;菜单栏下面是工具栏,以按钮的形式调用最常用的子窗体;窗体的左面是一个树型列表,可以通过它显示系统的所有功能;窗体的右面是一个和程序主题相关的背景图片;窗体的最下面,用状态栏显示当前登录的用户名及系统时间。主窗体运行结果如图1.21所示。
![](https://epubservercos.yuewen.com/64AA3F/13043251004879506/epubprivate/OEBPS/Images/Figure-P24_14773.jpg?sign=1739289271-tHDEVcYMEmBaXdskDV1NHqWefWPrpbv2-0-e25af8a9a312b12e6692547c0a1bfd73)
图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 主窗体主要用到的控件
![](https://epubservercos.yuewen.com/64AA3F/13043251004879506/epubprivate/OEBPS/Images/Figure-T25_51677.jpg?sign=1739289271-tp5TqAFCA14klYJZ2972RpftJQfOVFtw-0-aac17bdfd93c32b97d0a7418ff6a586c)
(2)声明局部变量及公共类ClsCon对象,通过ClsCon对象调用类中的方法,以实现数据库连接,代码如下:
例程06 代码位置:资源包\TM\01\houseAgency\frmMain.cs
![](https://epubservercos.yuewen.com/64AA3F/13043251004879506/epubprivate/OEBPS/Images/Figure-P25_52071.jpg?sign=1739289271-PAeOyOKNURXL0tPDLsnpil5zvdOeG1nK-0-573c4ca7298760beac13be6d125adb55)
在frmMain窗体的Load事件中,获取登录用户的名称及权限,并通过权限设置“员工信息”菜单的显示状态,然后调用自定义方法GetMenu()将菜单中的各命令项按照层级关系动态添加到TreeView控件中。frmMain窗体的Load事件代码如下:
例程07 代码位置:资源包\TM\01\houseAgency\frmMain.cs
![](https://epubservercos.yuewen.com/64AA3F/13043251004879506/epubprivate/OEBPS/Images/Figure-P25_52073.jpg?sign=1739289271-hEYmJib1N00zgLKKmW718NSmApJ8JRCW-0-193be2572dca77b07d8d788e1258d6d4)
GetMenu()方法是一个无返回值的自定义方法,它的主要功能是遍历MenuStrip控件的菜单项,然后将各菜单项按照层级关系添加到TreeView控件中。该方法关键代码如下:
例程08 代码位置:资源包\TM\01\houseAgency\frmMain.cs
![](https://epubservercos.yuewen.com/64AA3F/13043251004879506/epubprivate/OEBPS/Images/Figure-P26_52076.jpg?sign=1739289271-S1nn4rzFpT5OpoE67qZJp8MFrfXPsN9A-0-1c9e4c4aba1b79925998427c76ea709a)
因为本系统即可以在菜单栏中打开子窗体,又可以在树型列表中打开窗体,所以必要设置一个自定义方法frm_show(),通过各菜单项或节点的Tag属性值来打开相应的窗体。代码如下:
例程09 代码位置:资源包\TM\01\houseAgency\frmMain.cs
![](https://epubservercos.yuewen.com/64AA3F/13043251004879506/epubprivate/OEBPS/Images/Figure-P26_52078.jpg?sign=1739289271-9D9c06C1W5tmUzHTvTeXyn6ESvJX2dCY-0-1ab82d3ff33cd768a6a5bc073cca10da)
![](https://epubservercos.yuewen.com/64AA3F/13043251004879506/epubprivate/OEBPS/Images/Figure-P28_52080.jpg?sign=1739289271-OHw7vSVfRZnmHyOBIZuqnTHD9qJ71uXL-0-0b605f0bdf9d06be86c89ef1b849dcae)
下面用“求租人员信息”命令的单事件为例,来说明如何用自定义方法frm_show()来调用相应的子窗体。“求租人员信息”命令的Click事件关键代码如下:
例程10 代码位置:资源包\TM\01\houseAgency\frmMain.cs
![](https://epubservercos.yuewen.com/64AA3F/13043251004879506/epubprivate/OEBPS/Images/Figure-P28_52081.jpg?sign=1739289271-pSFPWlK2qL4CszZLTEr4c3R4N5hcIpxZ-0-f42cefd0b7cc4f38de0c71c01743c61a)