基于Extjs的web表单设计器 第三节——控件拖放
看过之前设计器截图的朋友应该有印象,可能会发觉我们的设计器UI设计布局其实类似Visual studio 的设计界面,采用的是左、中、右三个区域布局。左侧为控件区域、中间为表单的画布设区域、右侧为属性区域。这样的UI设计肯定就得支持控件的拖拽设计,用户只要拖放一个控件到我们的画布上,那么画布就应该立即能够看到我们拖放的控件在画布中的位置、大小、以及一些控件自带的默认信息。不用说这样的设计对于用户来说不论在操作体验上还是设计的感官上都更加直接和方便,因为我在设计阶段就可以知道我设计后的表单在系统运行时候的样子(What i see is what i get)。这个设计相对于我们1.0版本的设计器来说应该是很大的进步,要知道在1.0时代我们的设计器可是一个通过弹出框,然后在弹出框的下拉控件列表去选择控件类型,然后配置其他的xx属性......然后所有控件显示到一个grid列表中的,用户更不不知道这个表单是什么样子,还需要借助预览功能才能查看表单的样子。
我们的设计器既然要采用类似VS设计器的方式,那么我们也就必须解决一些比较重要的问题。
- 首先来说就是必须要支持控件的拖拽设计,也就是当用户进入我们的设计器界面,选择了左侧的某个控件后能够拖放到我们设计器的中间画布“指定”区域(注意是指定的位置,不是顺便一个位置)。
- 然后就是不同区域支持的控件类型可能不一样,那么我们就必须限定每个类型的区域控件能够支持哪些控件。也就是当一个被区域支持的控件拖放到我们的区域上面并释放鼠标后那么我们的区域就得接受该控件,如果是不被支持的控件拖放到我们的区域上面并释放鼠标后我们的区域控件不会有任何响应。
- 同一个区域内部的控件支持随意的交换位置,用户可在一个区域内部通过拖放控件来改变控件的位置。
- 我们的区域之间能够支持控件的拖放,比如将一个A区域的控件移动到B区域中区。也就是区域之间可以随意交换控件。
上面的几个问题是我们采用拖拽式表单设计器必须解决的问题,如何解决呢?通过研究extjs API 我们可以发现,对于extjs treepanel类型控件我们在它的view里面添加一个支持树节点拖放的treeviewdragdrop插件,实现代码如下:(请对比Ext.net 的写法和 纯extjs的写法上的区别.其实它们本质上是一样的,Ext.Net的代码在经过服务器解析之后生成的代码其实和纯extjs写的代码几乎一样。只是Ext.Net对.Net开发人员来说使用起来更方便,更熟悉,仅此而已.)
<ext:TreePanel ID="controlRegion" Title="表单控件" runat="server" Region="West" RootVisible="false"
Width="200" Split="true" Collapsible="true" Collapsed="false">
<Store>
...........................略
</Store>
<Root>
...........................略
</Root>
<View>
<ext:TreeView ID="TreeView1" runat="server">
<Plugins>
<ext:TreeViewDragDrop runat="server" EnableDrop="true" DragGroup="tree2div" />
</Plugins>
</ext:TreeView>
</View>
</ext:TreePanel>
Ext.Net 写法
Ext.create("Ext.tree.Panel",
{
store: { //.........略 },
id: "TreePanel1",
width: 200,
region: "west",
split: true,
collapsible: true,
title: "表单控件",
viewConfig: {
id: "TreeView2",
plugins: [
{
ptype: "treeviewdragdrop",
dragGroup: "tree2div"
}
],
xtype: "treeview"
},
root: { //.........略 },
rootVisible: false
})
extjs 写法
请注意代码中的包含treeviewdragdrop部分的代码,它的加入表示我们的树节点可以支持拖放了,但是仅仅这样还是远远不够的。我们还必须为我们设计器的画布提供接收拖放功能的代码,这里我们给出画布区域的代码和对画布支持拖放的代码。
我们的设计器代码中加入一个画布的panel ,结合前面一章节的介绍大家应该知道我们的画布其实是一个Mixed类型的混合区域控件。
<ext:Panel ID="mainPanel" runat="server" Region="Center" ButtonAlign="Center" Border="true"
BodyPadding="10" OverflowY="Auto">
<CustomConfig>
<ext:ConfigItem Name="type" Value="Mixed" Mode="Value" />
</CustomConfig>
</ext:Panel>
然后我们使用一个Droptarget来为我们的画布添加可以接收拖动释放的控件的功能
<ext:DropTarget ID="ddt" runat="server" Target="mainPanel" Group="tree2div" IgnoreSelf="false">
<NotifyDrop Fn="notifyDrop" />
<NotifyEnter Handler="ftConfig.isDraging=true;" />
</ext:DropTarget>
在这里注意一个地方就是在droptarget里面的group属性值为tree2div,这个值和我们前面给treepanel添加的treeviewdragdrop 的DragGroup属性值是必须一致的,不然是不能正常工作的。到目前为止我们其实仅仅解决了树的节点可以拖放,以及我们的mainpanel画布支持接受拖放过来的控件。但是我们的画布如何处理拖放过来的控件,以及每种区域控件可以接收的控件等等功能还得我们去设计和定义,具体的设计以及实现留到下一节吧。
基于Extjs的web表单设计器 第三节——控件拖放的更多相关文章
- 基于Extjs的web表单设计器 第七节——取数公式设计之取数公式的使用
基于Extjs的web表单设计器 基于Extjs的web表单设计器 第一节 基于Extjs的web表单设计器 第二节——表单控件设计 基于Extjs的web表单设计器 第三节——控件拖放 基于Extj ...
- 基于Extjs的web表单设计器 第六节——界面框架设计
基于Extjs的web表单设计器 基于Extjs的web表单设计器 第一节 基于Extjs的web表单设计器 第二节——表单控件设计 基于Extjs的web表单设计器 第三节——控件拖放 基于Extj ...
- 基于Extjs的web表单设计器 第五节——数据库设计
这里列出表单设计器系列的内容,6.7.8节的内容应该在春节后才有时间出了.因为这周末就请假回老家了,准备我的结婚大事.在此提前祝大家春节快乐! 基于Extjs的web表单设计器 基于Extjs的web ...
- 基于Extjs的web表单设计器 第二节——表单控件设计
这一节介绍表单设计器的常用控件的设计. 在前面两章节的附图中我已经给出了表单控件的两大分类:区域控件.常用控件.这里对每个分类以及分类所包含的控件的作用进行一一的介绍,因为它们很重要,是表单设计器的基 ...
- 基于Extjs的web表单设计器
由于这样工作和自身的一些原因很长一段时间没有写过博客了.最近想把自己前面一段时间搞出的一个表单设计器的相关经验或者经历记录下来.分享给大家,也算是对自己前2个月的一个总结回顾吧. 首先介绍一下开发此版 ...
- 基于Extjs的web表单设计器 第一节
前面一节介绍了表单设计器的背景和最终的大概样式,本节主要介绍表单设计器的需求及功能设计. 在讲需求之前先明确几个常用的概念: 主表或者卡片表——具有多行多列的一个区域的控件块,如下图所示. 明细表—— ...
- 基于Extjs的web表单设计器 第四节——控件拖放
接着上一节介绍控件拖放的设计. 通过前面的介绍知道,我们的区域类型的容器控件有三种:Card.Table.Mixed. Card 可以支持几乎所有的常用控件,包括:文本TextField.多文本Tex ...
- YbSoftwareFactory 代码生成插件【十六】:Web 下灵活、强大的审批流程实现(含流程控制组件、流程设计器和表单设计器)
程序=数据结构+算法,而企业级的软件=数据+流程,流程往往千差万别,客户自身有时都搞不清楚,随时变化的情况更是家常便饭,抛开功能等不谈,需求变化很大程度上就是流程的变化,流程的变化会给开发工作造成很大 ...
- .net web 开发平台- 表单设计器 一(web版)
如今为了适应需求的不断变化,动态表单设计器应运而生.它主要是为了满足界面的不断变化和提高开发速度.比如:一些页面客户可能也无法确定页面的终于布局,控件的位置,在哪种情况下显示或不显示等可能须要随时改动 ...
随机推荐
- codeforce1029B B. Creating the Contest(简单dp,简单版单调栈)
B. Creating the Contest time limit per test 1 second memory limit per test 256 megabytes input stand ...
- PhpStorm 配置在浏览器中打开文件
这东东中文资料太少- -鼓捣了好久才有结果 点击File-Settings-Deployment .点+按钮增加服务器 Mapping 设置工程路径等 点击 Edit Confi 这东东中文资料太少- ...
- gSOAP:C++编写服务器端
1.编写头文件cal.h: //gsoap ns service name: calc //gsoap ns service style: rpc //gsoap ns service encodin ...
- MS-TEST 批处理执行测试时的资源文件目录问题
What: 使用MS-TEST的 批处理执行它的测试 DLL 时,如: MSTest /testcontainer:C:\David\ADAccountGIT\AdAccountMSTest\ADA ...
- VS2010开发MFC ActiveX,摄像头拍照上传Webservice(1)
最近工作项目,BS中需要用到摄像头拍照,需要存储本地,同时上传到服务器,尝试使用vc++做ActiveX来实现. 完全没有使用过vc,上网搜索各种知识,初步完成.在这里记录下有帮助的资料. 第一步:编 ...
- C#中DateTime详解
//2008年4月24日 System.DateTime.Now.ToString("D"); //2008-4-24 System.DateTime.Now.ToString(& ...
- delphi datasnap
http://blog.csdn.net/shuaihj/article/details/6129121 http://blog.csdn.net/ddqqyy/article/details/617 ...
- Hello Vizhub
VizHub.com 一.介绍 Vizhub是一个使用D3.js和svg进行数据可视化的教学练三位一体的平台. 并且可以把在线编辑的代码保存到网站中. 右上角可以使用github账号登录. 二.Get ...
- Spring Cloud Bus实现自动更新配置
一.概述 1. 配置环境 版本:Spring Boot版本2.0.3.RELEASE,Spring Cloud版本Finchley.SR1,RabbitMQ 3.7.7 说明:本文章是在https:/ ...
- python's object model
[python's object model] 1.object.__init__(self[, ...]) 如果subclass没有实现__init__,那么python类在实例化的时 ...