1、广东农工商职业技术学院广东农工商职业技术学院VB.NET程序设计程序设计任务七任务七 利用高级控件完善系统利用高级控件完善系统广东农工商职业技术学院广东农工商职业技术学院2 本章学习目标:本章学习目标:掌握掌握TreeView、Splitter控件的使用控件的使用 了解过程的递归调用了解过程的递归调用 TreeView控件中显示数据库中的数据控件中显示数据库中的数据 掌握掌握DataGridView控件的使用控件的使用目标目标广东农工商职业技术学院广东农工商职业技术学院3 每个企业或机构都有层次性,在程序中要每个企业或机构都有层次性,在程序中要显示出企业或机构的组织关系,就要利用树结显示出企业
2、或机构的组织关系,就要利用树结构啦。构啦。怎样把存放在数据库中的数据显示成树的结怎样把存放在数据库中的数据显示成树的结构?构?问题的引入问题的引入广东农工商职业技术学院广东农工商职业技术学院4 在在“机构设计情况机构设计情况”窗体中增加窗体中增加TreeViewTreeView、SplitterSplitter控件。可以把数据库中的控件。可以把数据库中的数据在数据在TreeViewTreeView 上显示出来,在单击某节点时,把该节点对应的一些信息在文本框上显示出来,在单击某节点时,把该节点对应的一些信息在文本框TextBoxTextBox里显示出来。里显示出来。任务任务TreeView控件控
3、件Splitter控件控件广东农工商职业技术学院广东农工商职业技术学院5 任务:任务:在DataGridView控件中显示数据库中的数据任务任务DataGridView控件控件广东农工商职业技术学院广东农工商职业技术学院6 TreeView控件用于创建具有树形节点的层次结构控件用于创建具有树形节点的层次结构列表列表 该控件中每个节点还可以包含子节点该控件中每个节点还可以包含子节点 父节点能够以展开或折叠方式显示项目列表父节点能够以展开或折叠方式显示项目列表 树状列表的每个节点都是树状列表的每个节点都是TreeNode类的实例类的实例TreeView控件的相关知识控件的相关知识广东农工商职业技术
4、学院广东农工商职业技术学院7使用使用TreeView控件设计树状列表控件设计树状列表属性描述Nodes所有节点(TreeNode)组成集合(代码中单独使用时,表示根节点)SelectedNode返回或设定当前选定的节点。方法描述ExpendAll展开列表树的全部节点.该方法没有参数事件描述AfterSelect当用户在TreeView控件中单击节点时触发AfterSelect事件TreeView 控件的常用属性、方法和事件:控件的常用属性、方法和事件:广东农工商职业技术学院广东农工商职业技术学院8使用使用TreeView控件设计树状列表控件设计树状列表属性描述Nodes当前节点的所有子节点(T
5、reeNode)组成的集合Text节点显示的内容Parent返回当前节点的父节点Checked节点是否被选中方法描述New()TreeNode的构造函数。创建显示内容为空的节点New(str As String)TreeNode的构造函数。创建显示内容为str参数的值的节点Remove()删除当前节点 树状列表的每个节点都是树状列表的每个节点都是TreeNode类的实例,注类的实例,注意每个节点意每个节点TreeNode还有一个还有一个Nodes属性。属性。TreeNode类常用属性、方法类常用属性、方法:广东农工商职业技术学院广东农工商职业技术学院9使用使用TreeView控件设计树状列表控
6、件设计树状列表方法描述Add(str As String)在相应节点下添加子节点,子节点名为str的参数值Add(TreeNode实例)在相应节点下添加子节点TreeNode实例Remove(TreeNode实例)在相应节点下删除TreeNode实例的子节点Clear()删除相应节点下的所有子节点 Nodes属性是属性是TreeNodeCollection类的一个实例类的一个实例,是树是树状列表中所有节点构成的集合。可以通过状列表中所有节点构成的集合。可以通过Nodes(索索引值引值)来获得索引位置的节点,第一个节点的索引来获得索引位置的节点,第一个节点的索引为为0,第二个为,第二个为1,依次
7、类推。,依次类推。TreeNodeCollection类的常用方法如下类的常用方法如下:广东农工商职业技术学院广东农工商职业技术学院10设计窗体时在设计窗体时在TreeView中添加节点的步骤中添加节点的步骤 拖动拖动TreeView控件到窗体中控件到窗体中 单击选中单击选中Nodes属性,然后单击省略号按钮属性,然后单击省略号按钮 ,打,打开开“树节点编辑器树节点编辑器”单击单击“添加根添加根”按钮添加根节点按钮添加根节点 单击单击“添加子项添加子项”按钮添加当前节点的子节点按钮添加当前节点的子节点 单击单击“删除删除”按钮删除当前节点按钮删除当前节点广东农工商职业技术学院广东农工商职业技术
8、学院11 程序运行时在程序运行时在TreeView中加入节点的方法是中加入节点的方法是:使使用用TreeView控件控件Nodes属性的属性的Add方法来加入根节点方法来加入根节点,使用某个节点的使用某个节点的Nodes属性的属性的Add方法来加入子节方法来加入子节点。如要建立如图所示的树视图的代码:点。如要建立如图所示的树视图的代码:TreeView1.Nodes.Add(“省医药集团”)Dim newNode As TreeNodenewNode=new TreeNode(“省医药集团机关”)TreeView1.Nodes(0).Nodes.Add(newNode)newNode.Node
9、s.Add(“董事会秘书处”)newNode=new TreeNode(“省医药公司”)TreeView1.Nodes(0).Nodes.Add(newNode)第1个根节点下添加子节点newNode.Nodes.Add(“经理办公室”)在省医药公司节点下添加子节点TreeView1.Nodes.Remove(TreeView1.SelectedNode)删除选定的节点程序运行时在程序运行时在TreeView中添加节点中添加节点广东农工商职业技术学院广东农工商职业技术学院12随堂实训随堂实训 1、在窗体设计中创建如图的树视图。、在窗体设计中创建如图的树视图。2、然后再利用代码来创建如图的树视图
10、、然后再利用代码来创建如图的树视图参考代码参考代码1参考代码参考代码2广东农工商职业技术学院广东农工商职业技术学院13随堂实训随堂实训3、用代码创建如图所示的树结构图、用代码创建如图所示的树结构图广东农工商职业技术学院广东农工商职业技术学院14Splitter控件控件 Splitter 控件用于在运行时调整停靠控件的大控件用于在运行时调整停靠控件的大小。小。Splitter控件常用于窗体上控件所显示的数据控件常用于窗体上控件所显示的数据长度可变,如长度可变,如Windows资源管理器,它的数据窗资源管理器,它的数据窗格所包含的信息在不同的时间有不同的宽度格所包含的信息在不同的时间有不同的宽度广
11、东农工商职业技术学院广东农工商职业技术学院15Splitter控件控件 为使用户能够在运行时调整停靠控件为使用户能够在运行时调整停靠控件的大小,先将调整大小的控件停靠在容的大小,先将调整大小的控件停靠在容器的一条边缘器的一条边缘(Dock属性属性),然后将,然后将Splitter控件停靠在该容器的同一侧。控件停靠在该容器的同一侧。如图所示样式设置属性如下:如图所示样式设置属性如下:TreeView1.Dock=Left Splitter1.Dock=Left GroupBox1.Dock=FillGroupBoxTreeViewSplitter广东农工商职业技术学院广东农工商职业技术学院16过
12、程的递归调用过程的递归调用Sub F1()F1()End SubSub F1()F2()End SubSub F2()F1()End Sub图图1图图2 在调用一个过程中又出现直接或间接地调用该过程本在调用一个过程中又出现直接或间接地调用该过程本身,称为过程的递归调用。身,称为过程的递归调用。图图1在调用在调用F1的过程中,又要调用的过程中,又要调用F1过程,这就是直过程,这就是直接调用本过程接调用本过程 图图2在调用在调用F1的过程中要调用的过程中要调用F2,而在调用,而在调用F2过程中过程中又要调用又要调用F1,这就是间接调用过程本身,这就是间接调用过程本身广东农工商职业技术学院广东农工商
13、职业技术学院17过程的递归调用过程的递归调用 例如:有例如:有3个人坐在一起,问第个人坐在一起,问第3个人多少岁?他说个人多少岁?他说比第比第2个人大个人大2岁。问第岁。问第2个人岁数,他说比第个人岁数,他说比第1个人大个人大2岁。最后问第岁。最后问第1个人,他说个人,他说10岁,请问第岁,请问第3人多大人多大 上面两种递归调用都是无终止的自身调用,这是不上面两种递归调用都是无终止的自身调用,这是不应该出现的。只应该出现次数有限的、有终止的递归调应该出现的。只应该出现次数有限的、有终止的递归调用。这可以用条件控制,只有某个条件成立才继续执行用。这可以用条件控制,只有某个条件成立才继续执行递归调
14、用,否则不再继续。递归调用,否则不再继续。广东农工商职业技术学院广东农工商职业技术学院18过程的递归调用过程的递归调用 显然该例子是个递归问题。要求第显然该例子是个递归问题。要求第3个人个人的年龄,就要知道第的年龄,就要知道第2个人的年龄,而第个人的年龄,而第2个个人的年龄也不知道,他的年龄取决于第人的年龄也不知道,他的年龄取决于第1个个人的年龄。人的年龄。age(3)=age(2)+2age(2)=age(1)+2age(1)=10其过程如下:其过程如下:age(3)=age(2)+2 age(3)=14 age(2)=age(1)+2 age(2)=12 age(1)=10 广东农工商职业
15、技术学院广东农工商职业技术学院19过程的递归调用过程的递归调用 从图可知,求解分成两个阶段:第一个阶段是从图可知,求解分成两个阶段:第一个阶段是”回推回推”,即将第,即将第n个人的年龄表示为第个人的年龄表示为第(n-1)个人年龄个人年龄,直到第,直到第1个人的年龄。此时个人的年龄。此时age(1)已知,不必再已知,不必再前推。然后开始第二阶段,采用递推方法,从第前推。然后开始第二阶段,采用递推方法,从第1个个人的已知推算出第人的已知推算出第2个人的年龄个人的年龄。一个递归的问题可以分为一个递归的问题可以分为“回推回推”和和“递推递推”两两个阶段。要经历许多步才能求出最后的值,还必须要个阶段。要
16、经历许多步才能求出最后的值,还必须要有一个结束递归的条件。例如,有一个结束递归的条件。例如,age(1)=10,就是使递,就是使递归结束的条件归结束的条件广东农工商职业技术学院广东农工商职业技术学院20过程的递归调用过程的递归调用可以用一个函数来描述上述过程:可以用一个函数来描述上述过程:Function age(ByVal n as Integer)As IntegerDim c As Integerif n=1 thenc=10elsec=age(n-1)+2 递归调用End ifreturn c End Function Age(3)得到得到age(3)c=age(2)+2c=age(1
17、)+2c=10age函数函数 n=3age函数函数 n=2age函数函数 n=1Age(1)=10Age(2)=12Age(3)=14广东农工商职业技术学院广东农工商职业技术学院21过程的递归调用过程的递归调用显示TreeView控件中的所有节点 Sub PrintNodes()For Each trNode As TreeNode in treeView1.Nodes 此处Nodes表示树视图控件的根节点 PrintRecursive(trNode)NextEnd Sub Sub PrintRecursive(ByVal trNode As TreeNode)MessageBox.Show(
18、trNode.Text)For Each tn As TreeNode in trNode.Nodes 此处Nodes表示的是当前节点的子节点 PrintRecursive(tn)递归调用 NextEnd Sub 遍历遍历TreeView控件中每个节点,利用递归方控件中每个节点,利用递归方法可完成此操作,该方法循环访问每个树集合法可完成此操作,该方法循环访问每个树集合中的每个节点。中的每个节点。广东农工商职业技术学院广东农工商职业技术学院22从数据库中得到数据在从数据库中得到数据在TreeView控件显示控件显示字段名字段名类别类别 AbsIndex ParentIndex 字段类型字段类型文
19、本文本数字数字数字数字说明说明节点显示的内容节点显示的内容节点索引节点索引 对应的父节点索引对应的父节点索引有如下的数据表有如下的数据表(节点表节点表):该数据表中记录如下该数据表中记录如下从数据表记录中从数据表记录中:ParentIndex=-1表示该节点为表示该节点为TreeView控件的根节点控件的根节点.表中对应的表中对应的TreeView控件节点如图所示控件节点如图所示:广东农工商职业技术学院广东农工商职业技术学院23从数据表中以absIndex字段顺序查询出数据 调用InitTree(treeView1.Nodes,“-1”)过程。该过程如下Sub InitTree(ByRef n
20、odes As TreeNodeCollection,ByVal sParentIndex As String)Dim tmpNode As TreeNode,absIndex As String 选出数据源中ParentIndex为sParentIndex数据行,放在行集合DataRow的drs中 循环添加TreeNode,即添加ParentIndex=sParentIndex的所有记录(子节点)For Each dr As DataRow In drs 获得节点所需数据 tmpNode=New TreeNode tmpNode.Text=dr(类别)absIndex=dr(AbsIndex
21、)nodes.Add(tmpNode)添加节点 递归调用,添加子节点下的所有子节点 InitTree(nodes(nodes.Count-1).Nodes,absIndex)NextEnd Sub 从数据库中得到数据在从数据库中得到数据在TreeView控件显示控件显示要利用上面数据表中的数据在要利用上面数据表中的数据在TreeView控件上显示控件上显示,也要用到递归方法。,也要用到递归方法。把和节点有关的表比如把和节点有关的表比如“节点表节点表”直接直接拖到窗体上,接着,不用的控件删除,拖到窗体上,接着,不用的控件删除,比如:比如:DataGridView,BindingNavigator
22、。然后添加一然后添加一TreeView控件。最终界面如图控件。最终界面如图所示。所示。广东农工商职业技术学院广东农工商职业技术学院24从数据库中得到数据在从数据库中得到数据在TreeView控件显示控件显示-代码代码广东农工商职业技术学院广东农工商职业技术学院25从数据库中得到数据在从数据库中得到数据在TreeView控件显示控件显示-运行效果运行效果广东农工商职业技术学院广东农工商职业技术学院26随堂实训随堂实训 利用数据库节点表中的数据,来创建如下利用数据库节点表中的数据,来创建如下的树视图的树视图广东农工商职业技术学院广东农工商职业技术学院27关于关于DataGridView控件控件 当
23、需要在当需要在Windows窗体应用程序中显示窗体应用程序中显示表格数据时,应首先考虑使用表格数据时,应首先考虑使用DataGridView控件。控件。广东农工商职业技术学院广东农工商职业技术学院28 使用使用DataGridView控制外观显示方式控制外观显示方式-调整列宽调整列宽调整列宽调整列宽通过属性通过属性AutoSizeColumnsMode实现,取值主要包括:实现,取值主要包括:AllCells:调整列宽,以适合该列中的所有单元格的内容,包括标题单元格。:调整列宽,以适合该列中的所有单元格的内容,包括标题单元格。AllCellsExceptHeader:调整列宽,以适合该列中的所有
24、单元格的内容,不包括标题单元:调整列宽,以适合该列中的所有单元格的内容,不包括标题单元格。格。ColumnHeader:调整列宽,以适合列标题单元格的内容。:调整列宽,以适合列标题单元格的内容。DisplayCells:调整列宽,以适合当前屏幕上显示的行的列中的所有单元格的内容,包:调整列宽,以适合当前屏幕上显示的行的列中的所有单元格的内容,包括标题单元格。括标题单元格。DisplayCellsExceptHeader:调整列宽,以适合当前屏幕上显示的行的列中的所有单元格调整列宽,以适合当前屏幕上显示的行的列中的所有单元格的内容,不包括标题单元格的内容,不包括标题单元格广东农工商职业技术学院广
25、东农工商职业技术学院29 使用使用DataGridView控制外观显示方式控制外观显示方式-某列某列单元格显示格式与字体单元格显示格式与字体通过属性通过属性ColumnsDefaultCellStyle设置:设置:广东农工商职业技术学院广东农工商职业技术学院30 使用使用DataGridView控制外观显示方式控制外观显示方式-某列某列单元格显示格式与字体单元格显示格式与字体外观格式设置颜色和字体等外观格式设置颜色和字体等Format设置单元格的设置单元格的格式字符串格式字符串设置了格式的列设置了格式的列未设置格式的列未设置格式的列广东农工商职业技术学院广东农工商职业技术学院31 使用使用Da
26、taGridView控制外观显示方式控制外观显示方式-奇数行的单元格样式奇数行的单元格样式广东农工商职业技术学院广东农工商职业技术学院32小结小结 本任务学习了本任务学习了TreeView、DataGridView等高等高级控件的使用和过程的递归调用。级控件的使用和过程的递归调用。广东农工商职业技术学院广东农工商职业技术学院33 完成数据库中的数据在完成数据库中的数据在TreeView控件上控件上的显示。的显示。习题习题广东农工商职业技术学院广东农工商职业技术学院34实训实训 单击单击TreeView的某节点时,把该节点对应的一些信息在文本框的某节点时,把该节点对应的一些信息在文本框TextB
27、ox里显示出来。里显示出来。广东农工商职业技术学院广东农工商职业技术学院35实训实训参考答案参考答案(新版本新版本不用不用DataView对象对象)广东农工商职业技术学院广东农工商职业技术学院36实训实训参考答案参考答案step1创建一树节点类(创建一树节点类(TreeNodeData),然后:),然后:1)添加五个)添加五个Public字段:字段:Public AbsIndex As Integer Public ItemIndex As Integer Public ItemLevel As Integer Public ParentIndex As Integer Public Kind
28、Code As String Public DepCode As String 2)添加一有参数的构造函数用来初始化五个字段的。)添加一有参数的构造函数用来初始化五个字段的。Sub New(ByVal sAbsIndex As Integer,ByVal sItemIndex As Integer,ByVal sItemLevel As Integer,_ ByVal sParentIndex As Integer,ByVal sKindCode As String,ByVal sDepCode As String)AbsIndex=sAbsIndex ItemIndex=sItemIndex
29、 ItemLevel=sItemLevel ParentIndex=sParentIndex KindCode=sKindCode DepCode=sDepCode End Sub 广东农工商职业技术学院广东农工商职业技术学院37实训实训参考答案参考答案step2在把数据库里的相关数据显示在在把数据库里的相关数据显示在TreeView的过程中,使用的过程中,使用TreeNodeData类保存一些信息。类保存一些信息。广东农工商职业技术学院广东农工商职业技术学院38实训实训参考答案参考答案step3添加添加TreeView的的AfterSelect事件事件,在该事件中,根据字段在该事件中,根据字段“单位编号单位编号”进行筛进行筛选。选。