CK表达式编辑器
1. 什么是表达式编辑器?
这个工具允许技术员传入一系列的参数,由用户编辑一个公式返回一种特定的结果。之所以需要使用表达式编辑器,就是因为用户编辑的公式经常变,技术员无法想出一办法来适应用户的需求。简单说,编辑器的作用与Excel的公式是相似的。
这个工具在国外是比较成熟的,如DevExpress就有相关的公式编辑器。如下图所示
还有做得像个编程工具一样的:
表达式编辑器中的编辑文本,是需要一种解释逻辑才能解释出来的,常见的办法就像Excel那样拥有独立的解释引擎,但也有直接使用某种语言的编译器进行解释,如Javascript,VB等都有相当成熟的实现。
2. 什么时候使用表达式编辑器
首先,该工具一般是开发员,实施员和用户使用的,目标是减少程序的变化,但能适应客户的需要。下面举例几个常见的例子:
1, 商品金额计算
随着业务的发展,客户的要求不同(笔者只举大家可以简单理解的例子,过于简单不要介意)
Level1:单价*数量,但如果开发员这样操作的话,那就可能要不断改程序了。
客户的业务发展了,要增加打折:
Level2:单价*数量*打折,但是大家都知道这可能不够。
客户接着发展了会员系统:
Level3:单价*数量*打折*(会员折扣),这个方案也许会好一点,但似乎还不行。
客户发展了外国商品:
Level4:(总价-税率-运费)/货品数*数量*打折*(会员折扣)。那又怎样呢?
…………………
作为软件编写者,可以不断修改自己的程序,但每一次修改都面临大量的测试,测试后也可能会出现更多的BUG,客户也会觉得很烦。这时客户就会发飙骂人:“能不能动动脑子,像人家Excel那样配置好不好?”做程序员的不敢得罪无理的客户,那只有苦逼地接受。那能不能让这个事情简单一点呢?就算不能完全解决问题,也起码让测试好做一点呢?
2, 工资计算
随着业务发展,客户的要求也是不同的。
Level1:工资等级决定工资,如 C3=2000元。
Level2:工作年限*100 + 等级工资 – 社保。
Level3:工作年限*100 + 等级工资 + (各项目奖金) – 社保五金。
Level4:工作年限*100 + 等级工资 + (各项目奖金) – 社保五金 + 高温/粉尘/空调费补贴。
Level5:工作年限*100 + 等级工资 + (各项目奖金) – 社保五金 + 高温/粉尘/空调费补贴 + 岗位补贴。
………………………….
同样的问题,你会觉得客户都是“变态”的。但客户觉得软件连这些都想不到,真是垃圾。那有没有办法让这些东西变得简单一点。
3. CK表达式编辑器
CK表达式编辑器就是尝试解决需求变化而导致的程序频繁改变问题的。为了增强编辑器的功能,而使用了.Net C# 4.0来做编译器,对类型控制也非常严格,不过没有C#基础,恐怕是难以操作这个编辑器。
下面用几个例子来讲解编辑器:
3.1. 编辑界面介绍
编辑界面是使用C#4.0编译器的,所以语法的表达形式都是C#的。
表达式编辑区
可以对部分方法和属性进行颜色区分,对有一定编程经验的朋友有一定帮助。
脚本
如果勾选了脚本,则表达式编辑区的内容一定要是一个方法,即一定要有return,每一行都有;号。
类别
包含了默认和用户传入的方法的类别。
方法
所有可以高亮显示的方法,不过,如果用户传入了新的命名空间,即使不是高亮显示的方法也是可用的。
传参区
可以查看开发员传入的参数,如果在字典区,可以双击参数名,在表达式编辑区显示。
表格定义
如果开发员传入了DataTable对象,由表达式编辑区那里可以使用List来引用该DataTable默认对应的实体,编辑器会自动生成新的类型。
方法说明区
详细介绍各个方法的使用语法。
编译生成类
这是一个给C#开发员查看的选项卡,有C#开发经验的朋友会非常容易看明白生成的内容,从而调整自己的表达式,不过没C#开发经验的朋友还是不要看为好。
3.2. 常用操作
3.2.1. 常规类型的四则运算
点击设计
设计完成之后,点保存,返回前一个界面,随意修改界面中的参数,再点计算就可以计算出结果了。
3.2.2. 常规类型的.Net语法运算
原理相对简单,不作更多说明。
3.2.3. List,DataTable的操作运算
List,DataTable是.Net中常见的集合类型。
而要操作这两种集合,就要对C#的集合编辑有一定的了解了,如
Sum(Table,r=>CTypeDecimal(r[“单价”])*CTypeDecimal(r[“数量”]))
其中Sum,CTypeDecimal都是编辑器自带的C#方法,而Lambda表达式的写法,已经算是C#对集合操作中比较简单的写法了。
上图中,List是默认从DataTable转换过来的对象集合。
3.2.4. 任意类型的操作运算
为了达到编辑器最大的功能,可以支持任意的类型进行操作,如下图:
上表中,“列表.DataSource”中的“列表”是一个控件的Name,这里就只有学过.Net WindowsForm才能明白写什么了。
3.3. 高级操作
3.3.1. 脚本与单一返回
控件不只是简单返回一个值,还可以写一堆的脚本。
也就是说你可以在脚本上对数据集进行操作。
不过,写脚本的话,你必须非常清楚C#的语法,不然也没办法做到的。
3.3.2. 引入新命名空间
编辑器还可以无限扩展功能,可以引入命名空间,如下图,System.IO是原来没有的功能,但可以通过编辑引入。并实现IO操作。
3.3.3. 引入自定义方法
编辑器甚至可以引入你自己写的一个方法,可以是string 格式,还可以是Delegate对象形式的,也就是什么自己写的方法都可以。
不过为了让开发自己写的方法与编辑器的后续方法不冲突,强制要求用户为方法名或属性的名称增加下划线_。
增加自定义方法的办法:
请注意到:Function = new Func<string,string,string>(this._SayHelloWorld)这个写法,这就是直接使用用户自己定义的方法。
4. 源代码与使用
笔者不会开放源代码。
允许单位和个人免费使用,可以商业使用。
如果发现BUG,非常欢迎知会本人。
使用例子源代码 http://files.cnblogs.com/jingle/CKExpressionEditorSample_src.zip
使用例子可执行程序 http://files.cnblogs.com/jingle/CKExpressionEditorSample_bin.zip
CK表达式编辑器的更多相关文章
- DevExpress控件扩展之表达式编辑器
业务需求: 业务工作中经常需要对表格中的数据进行处理,包括过滤.复合计算等.过滤需要有过滤条件,复合计算需要计算公式.这两种场景都需要一个表达式编辑器.GridControl自带过滤条件的表达式编辑器 ...
- Asp.Net之自定义表达式构造器(ExpressionBuilder)
在Asp.Net的Page页面中我们经常会使用到资源文件.读取资源文件的方式为:<%$Resources:Resource1,Test1%>,这样就可以显示Resource1这个资源文件中 ...
- SSIS 学习(4):变量和表达式【转】
变量,作为程序员的我们,是一个多么熟悉的概念,从开始学习编程的第一天起,就要了解什么是变量?如何定义一个变量?变量的使用范围等.现在还有必 要在这里大费口舌来讨论“变量”吗?不错,我们今天谈的变量,也 ...
- FastReport.Net使用:[13]如何使用表达式
在FastReport报表中,表达式(Expressions)用在很多地方,譬如文本框,排序过滤器等. 表达式基于报表选择的脚本语言,从菜单[报表]->[选项]打开“报表选项对话框”,切换到“脚 ...
- PYTHON黑帽编程1.5 使用WIRESHARK练习网络协议分析
Python黑帽编程1.5 使用Wireshark练习网络协议分析 1.5.0.1 本系列教程说明 本系列教程,采用的大纲母本为<Understanding Network Hacks At ...
- 第十五篇 Integration Services:SSIS参数
本篇文章是Integration Services系列的第十五篇,详细内容请参考原文. 简介在前一篇,我们使用SSDT-BI将第一个SSIS项目My_First_SSIS_Project升级/转换到S ...
- 第十三篇 Integration Services:SSIS变量
本篇文章是Integration Services系列的第十三篇,详细内容请参考原文. 简介在前一篇我们结合了之前所学的冒泡.日志记录.父子模式创建一个自定义的SSIS包日志记录模式.在这一篇,我们将 ...
- 转 SSIS处理导入数据时, 存在的更新, 不存在的插入
SSIS处理导入数据时, 存在的更新, 不存在的插入 分类: DTS/SSIS2006-09-10 12:43 18185人阅读 评论(22) 收藏 举报 ssissql servermicrosof ...
- Selenium-Python学习——通过XPath定位元素
用Xpath定位元素的方法总是记不住,经常要翻出各种文档链接参考,干脆把需要用到的内容整到这个笔记中方便查找. Xpath是在XML文档中定位节点的语言.使用 XPath 的主要原因之一是当想要查找的 ...
随机推荐
- TestCase--搜索&查询模块
一般地,电商网站的搜索模块都是一个搜索字段的输入框和一个搜索按钮组成 如下所示: 而电商网站的后台系统,如erp.wms等系统,一般都会有下方的查询模块 其中包括:时间选择框.下拉框.输入框等 如下所 ...
- 应用层(一)HTTP服务访问基本流程和HTTP报文详解
HTTP属于TCP/IP模型中一个面向文本的应用层协议,所使用的服务器端口号的TCP中的80端口,通信双方在这个基础上进行通信. 每个服务器都有一个应用进程,时刻监听着80端口的用户访问请求.当有用户 ...
- 家业兴衰说传承(cc)
家业兴衰说传承 2011年10月30日 09:53 选稿:天潼 来源:东方网 作者:万润龙 浙商走笔之九 “富贵子生浪荡子,浪荡子生苦恼子,苦恼子生勤奋子,勤奋子生富贵子”.这“四子歌”是流传在浙 ...
- 堆栈的实现(c语言)
#include <stdio.h> #include <stdlib.h> #include <stdbool.h> #define EmptyTOS (-1) ...
- STL源码分析-AVL树-RB树
AVL树 不平衡情况 插入节点位于左子节点的左子树(左左) 插入节点位于左子节点的右子树(左右) 插入节点位于右子节点的左子树(右左) 插入节点位于右子节点的右子树(右右) 左左.右右为外侧插入,左右 ...
- python3.5在print和input上的几个变化
1. 在python3.5中使用print,打印内容必须用括号()括起来.python2.7中可以不用括号,如果你加了括号,代码在python2.7中也是可以正常运行的. python3.5 exam ...
- JavaScriptSerializer.MaxJsonLength属性问题
JavaScriptSerializer.MaxJsonLength属性用于获取或设置接受的JSON字符串的最大长度,超出设定值时序列化或反序列化会失败.常见的出错的场景有: 1.序列化: 以下代码在 ...
- 如何利用jq来实现复选框的全选,反选!
$("document").ready(function(){ $("#btn1").click(function(){ $("[name='chec ...
- css兼容
1.不同浏览器默认边距不同,必须对body自定义:margin:0;padding:0; 2.margin.padding属性值为%时,不是所有浏览器都支持: 3.transparent属性,IE7之 ...
- Hbase rest方式获取指定key范围内的值
代码如下: <?php class Monitor_Hbase{ private $rest_host = "http://10.99.90.39:8130/";//rest ...