在V开发平台普通窗体的工具箱中,有3个菜单控件(下拉菜单、导航菜单和开始菜单),它们的功能分别如下:
用于多级菜单设置,用户可以设置添加多级菜单项;
可切换两个新的空间来标记、展示和定位目标的分类或内容;
可切换两个新的空间来标记、展示和定位目标的分类或内容。
针对不同的业务场景,使用不同的菜单控件,但每种菜单控件的属性基本一致。菜单控件的“数据源类型”均支持:Control控件、Rule后台活动集和Table前台实体,Control为自定义菜单设计数据;Rule需要进行活动集参数的设置(主要针对二次开发使用,这里将不展开讲解);Table为添加前台实体,获取菜单数据。
数据源类型为Table时,菜单类型支持win和rule两种方式,win表示菜单将进行打开窗体的操作,rule表示菜单将执行对应活动集的操作。其前台实体的数据字段设置如下:
下面,以“导航菜单”为例,针对“Control控件”和“Table前台实体”两种数据类型的具体使用进行讲解。
根据业务需求,添加一个主窗体“导航菜单演示一”,以及两个备选窗体“测试一”和“测试二”。其中备选窗体主要用于点击菜单时切换新的空间来展示内容。
(1)在主窗体“导航菜单演示一”的左边添加一个导航菜单控件,右边添加一个组件容器控件(主要用于点击不同菜单,以窗体容器的方式打开对应的页面),设置组件容器的页签显示方式为Always,界面设计如下:
选中“导航菜单”控件,在属性中的数据源类型设置为Control,并且进行菜单设计的设置。
在菜单设计器中,需要添加对应的面板,每个面板下需要添加对应的节点数据,下面为“导航菜单”添加3个面板,其中为菜单面板1添加3个菜单节点,并且更改对应的面板名称和菜单名称,如下图:
(2)在备选页“测试一”和“测试二”中其业务逻辑设计与“菜单控件”的使用没有直接关系,所以在本文档实例中,对应备选页的实体定义和窗体方法配置将省略,可根据实际业务添加对应的业务窗体。这里使用“添加日程”窗体和“更多日程”窗体为例作为演示,界面设计分别如下:
在本实例(数据源类型为Control)的主窗体中,不需要添加任何实体;在备选页中添加的实体可根据实际业务需求自定义添加,这里将不展开演示。
在主窗体“导航菜单演示一”中,为导航菜单对应的菜单节点添加事件。
为“菜单1.1”添加单击事件,如下:
为“菜单1.2”添加单击事件,如下:
其中,这里的备选页的窗体方法配置将省略,可根据实际业务需求进行相应的配置。
点击菜单1.1,窗体容器中会加载“添加日程”内容;点击“菜单1.2”,窗体容器中会加载“添加日程”内容,效果图如下:
根据业务需求,添加一个主窗体“导航菜单演示二”,同时添加对应的V平台菜单实体数据相关页面:“菜单实体数据管理”和“新增菜单实体数据”,以及两个备选窗体“测试一”和“测试二”。其中备选窗体主要用于点击菜单时切换新的空间来展示内容。
(1)在主窗体“导航菜单演示”的左边添加一个导航菜单控件,右边添加一个组件容器控件(主要用于点击不同菜单,以窗体容器的方式打开对应的页面),设置组件容器的页签显示方式为Always,界面设计如下:
选中“导航菜单”控件,在属性中的数据源类型设置为Table,并将它与实体进行绑定。
注:在数据源类型为Table时,组件打开方式只有在实体数据菜单类型为win时才生效,如果菜单类型为rule,那么活动集中配置何种规则,将以何种方式打开窗体。组件打开方式支持三种类型:NewWindow(新窗口)、SpecifiedWindow(指定窗口)和SpecifiedContainer(指定容器)。本实例中,以SpecifiedContainer(指定容器)为例。
(2)在窗体“菜单实体数据管理”中,主要用列表控件加载菜单实体的数据,并且添加相关按钮进行数据的管理操作,界面设计如下:
(3)在窗体“新增菜单实体数据”中,主要以弹窗的方式,针对“菜单实体数据管理”页中选择的上级菜单数据,进行对应菜单实体数据的添加,所以在该页面中需要添加窗体输入:
界面设计如下:
(4)在备选页“测试一”和“测试二”的界面设计可参考“2.1.1窗体定义”章节中相关的讲解。
在本实例(数据源类型为Table)的主窗体 “导航菜单演示二”窗体、以及菜单数据管理窗体“菜单实体数据管理”和“新增菜单实体数据”中,均需要添加V平台菜单实体,V平台菜单实体的字段固定不可随意更改(其字段和含义可参考“1功能介绍”章节中相关的说明)。
下面根据V平台菜单实体数据源规定的字段,在“导航菜单演示二”窗体、“菜单实体数据管理”窗体和“新增菜单实体数据”窗体中,添加实体menuItem(菜单模式),并将其生成对应的表menuItem(菜单模式)数据:
在“导航菜单演示二”窗体中对应的操作(事件)与规则列表:
编号 |
功能描述 |
操作事件 |
规则 |
1 |
加载菜单实体数据 |
窗体加载 |
1. 从数据库获取数据到界面实体 |
2 |
rule规则方法1 |
自定义方法 |
1. 打开窗体并返回数据 |
下面将编号2“rule规则方法1”的功能进行详细讲解:
该方法主要用于测试,在添加菜单数据的菜单类型为rule,那么需要添加对应rule活动集进行效果测试,在这个方法中,添加的规则为“打开窗体并返回数据”,其规则配置如下:
在“菜单实体数据管理”窗体中对应的操作(事件)与规则列表:
编号 |
功能描述 |
操作事件 |
规则 |
1 |
默认列出菜单实体(menuItem)信息 |
窗体加载 |
1. 从数据库获取数据到界面实体 |
2 |
新增菜单实体(menuItem)记录 |
按钮单击 |
1. If(GetEntityRowCount("menuItem")<=0){ 1.1 打开窗体并返回数据 } 2. Else{ 2.1 打开窗体并返回数据 } 3. 从数据库获取数据到界面实体 |
3 |
删除菜单实体(menuItem)记录 |
按钮单击 |
1. 删除界面实体记录 |
4 |
保存菜单实体(menuItem)数据 |
按钮单击 |
1. 保存界面实体到数据库 2. 显示设置的提示信息 |
下面将编号2“新增菜单实体(menuItem)记录”的功能进行详细讲解:
第一步,首先判断界面实体记录是否小于等于0(GetEntityRowCount("menuItem")<=0),If为True,则实体(menuItem)数据为空,点击新增按钮时,将新增顶级菜单数据,那么在“打开窗体并返回数据”规则中将不进行被打开窗体的参数传递。
第二步,Else为False,则实体(menuItem)数据不为空,点击新增按钮时,根据当前列表中选中的菜单,进行新增下级菜单数据,那么在“打开窗体并返回数据”规则中将进行被打开窗体的参数传递。
第三步,重新添加“从数据库获取数据到界面实体”规则,主要是起到刷新界面实体数据的作用。
在“新增菜单实体数据”窗体中对应的操作(事件)与规则列表:
编号 |
功能描述 |
操作事件 |
规则 |
1 |
新增菜单实体(menuItem)记录 |
窗体加载 |
1. 新增界面实体记录 2. If(IsNullOrEmpty(@itemPid,"")==""){ 2.1 控制属性设置 2.2 控制控件的只读、使能、显示 } 3. Else{ 3.1 控制属性设置 3.2 给界面实体/控件/变量赋值 } |
2 |
菜单类型(下拉选择控件) |
值改变事件 |
1. If(CC.JGComboBox1.Value=="win"){ 1.1清空控件数值 1.2 控制控件的只读、使能、显示 } 2. Else{ 2.1清空控件数值 2.2 控制控件的只读、使能、显示 } |
3 |
保存菜单实体(menuItem)数据 |
按钮单击 |
1. If(IsNullOrEmpty(@itemPid,"")==""){ 1.1保存界面实体到数据库 1.2显示设置的提示信息 } 2. Else{ 2.1必填项检查 2.2 If(必填项通过){ 2.2.1保存界面实体到数据库 2.2.2显示设置的提示信息 2.2.3 修改数据库中的记录 } } |
4 |
返回 |
按钮单击 |
1. 退出窗体 |
下面将编号1“新增菜单实体(menuItem)记录”的功能进行详细讲解:
第一步,首先添加“新增界面实体记录”规则,新增数据;
第二步,判断如果窗体输入itemPid为空(IsNullOrEmpty(@itemPid,"")==""),即添加的是顶级菜单数据,那么在“新增菜单实体数据”窗体中的label标题属性设置为“添加顶级菜单”,并且只允许填写菜单名称和菜单编号,其他控件只允许只读,不可填写数据。
“控制属性设置”规则配置如下:
“控制控件的只读、使能、显示”规则配置如下:
第三步,如果窗体输入itemPid不为空,则添加下级菜单数据,那么在“新增菜单实体数据”窗体中的label标题属性设置为“上级菜单:itemName”,并且将窗体输入赋值给对应的实体字段。
“控制属性设置”规则配置如下:
“给界面实体/控件/变量赋值”规则配置如下:
下面将编号2“菜单类型(下拉选择控件)”的功能进行详细讲解:
第一步,由于菜单类型为必填字段,如果选择菜单类型为win(CC.JGComboBox1.Value=="win"),那么在窗体中对应的rule参数设置的控件数据将清空,并且只允许只读;
其中,由于win被打开窗体参数设置的相关控件置于面板Panel1中,rule被执行活动集参数设置的相关控件置于Panel2中,那么在控制控件只读时,只要针对Panel1和Panel2控件进行控制即可。
“控制控件的只读、使能、显示”规则配置如下:
“清空控件数值”规则配置如下:
第二步,否则,那么选择菜单类型为rule,那么在窗体中对应的win参数设置的控件数据将清空,并且只允许只读;
“控制控件的只读、使能、显示”规则配置如下:
“清空控件数值”规则配置如下:
下面将编号3“保存菜单实体(menuItem)数据”的功能进行详细讲解:
第一步,判断如果窗体输入itemPid为空(IsNullOrEmpty(@itemPid,"")==""),即添加的是顶级菜单数据,直接保存界面实体到数据库,并且显示保存成功的提示信息即可。
第二步,如果窗体输入itemPid不为空,则添加下级菜单数据,那么需要进行必填项(菜单类型)的验证。如果必填项通过(BR_OUT.BRCode3.isCheckRequiredOK),则保存界面实体到数据库,显示保存成功的提示信息,并且修改数据库中的记录。
因为在实际业务中,一般只有叶子节点菜单才能最终打开窗体或者执行对应的活动集操作。所以在叶子菜单保存成功后,需要更改其对应的上级菜单的数据,其过滤条件为([menuItem].[id]== @itemPid),主要是更改“新增菜单”对应父菜单的叶子节点为False,并且清除父菜单中对应的win和rule设置的参数,以及菜单类型(在实际业务中,可根据业务需求进行相应的更改)。规则配置如下:
首先需要添加V平台菜单实体数据,那么需要在“菜单实体数据管理”页中添加数据。
第一次新增菜单实体数据时,为顶级菜单数据,如下图:
在添加下级菜单时,可查看到上级菜单的名称,以及填写对应的菜单类型参数。
在菜单类型为win时,在win被打开窗体的参数设置中,被打开窗体所属的构件编码和窗体编码为必填,所属构件参数(暂时无用,保留),请求参数根据实际业务需求选择填写;
在菜单类型为rule时,在rule被执行活动集的参数设置中,被执行活动集所属的构建编码和窗体编码,以及活动集编码为必填,活动集参数根据实际业务需求选择填写。
注:rule活动集所在的窗体必须和添加导航控件窗体一致。
(1)菜单类型为win的效果,win打开窗体的方式为指定容器,主要是在开发平台中,选中导航菜单后,在属性中进行相关“组件打开方式”的设置(参考2.2.1窗体定义),在本实例中以指定容器的方式打开窗体,如下:
(2)菜单类型为rule时,其活动集配置的规则为“打开窗体并返回数据”,并且以弹窗的方式,如下: