DevExpress控件扩展之表达式编辑器
业务需求:
业务工作中经常需要对表格中的数据进行处理,包括过滤、复合计算等。过滤需要有过滤条件,复合计算需要计算公式。这两种场景都需要一个表达式编辑器。GridControl自带过滤条件的表达式编辑器,我们要做的就是把这个编辑器拿出来,独立于GridControl,进而可以绑定到其它控件上。
实现原理:
找到表达式编辑器内部类UnboundColumnExpressionEditorForm,这是一个窗口类。我们将其边框设置为None,Dock属性设置为Fill,拖放到控件上,使其看上去像个控件,并公布出获取表达式字符串的方法。
代码片段:
public class UnboundExpressionPanel : PanelControl {
public UnboundExpressionPanel() : base() {
BorderStyle = DevExpress.XtraEditors.Controls.BorderStyles.NoBorder;
StartEdit(new GridColumn());
}
object[] arguments;
protected object[] Arguments { get { return arguments; } }
MyUnboundColumnExpressionEditorForm form = null;
protected MyUnboundColumnExpressionEditorForm Form { get { return form; } }
private GridColumn fUnboundColumn;
public GridColumn UnboundColumn {
get { return fUnboundColumn; }
set {
if (fUnboundColumn == value) return;
StartEdit(value);
}
}
protected MyUnboundColumnExpressionEditorForm CreateForm(params object[] arguments)
{
return new MyUnboundColumnExpressionEditorForm(arguments[0], null);
}
protected void ApplyExpression(string expression) {
if (Arguments == null) return;
((GridColumn)Arguments[0]).UnboundExpression = expression;
}
public void StartEdit(params object[] arguments) {
if (arguments.Length < 1) return;
GridColumn unboundColumn = arguments[0] as GridColumn;
if (unboundColumn == null) return;
fUnboundColumn = unboundColumn;
DestroyForm();
this.arguments = arguments;
this.form = CreateForm(arguments);
if (form == null) return;
form.Dock = DockStyle.Fill;
form.TopLevel = false;
form.FormBorderStyle = FormBorderStyle.None;
form.Closing += new CancelEventHandler(form_Closing);
form.buttonCancel.Click += new EventHandler(buttonCancel_Click);
form.buttonOK.Text = "Apply";
Controls.Add(form);
form.Visible = true;
}
void buttonCancel_Click(object sender, EventArgs e)
{
if (form != null) form.Close();
}
void form_Closing(object sender, CancelEventArgs e)
{
e.Cancel = true;
if (this.arguments == null || this.form == null) return;
if (form.DialogResult == DialogResult.OK)
{
ApplyExpression(form.Expression);
}
else
{
form.ResetMemoText();
}
}
public void DestroyForm()
{
if (form != null) form.Dispose();
form = null;
}
}
public class MyUnboundColumnExpressionEditorForm : UnboundColumnExpressionEditorForm
{
public MyUnboundColumnExpressionEditorForm(object contextInstance,
IDesignerHost designerHost)
: base(contextInstance, designerHost) { }
private string GetExpressionMemoEditText()
{
GridColumn column = ContextInstance as GridColumn;
return null == column ? string.Empty : column.UnboundExpression;
}
public void ResetMemoText()
{
ExpressionMemoEdit.Text = GetExpressionMemoEditText();
}
}
下载地址:
http://pan.baidu.com/s/1sjn24cH
DevExpress控件扩展之表达式编辑器的更多相关文章
- 扩展方法实现DevExpress控件校验
DevExpress控件中,如果要控件的值进行校验,需要用到DXValidationProvider控件和DXErrorProvider控件,按照正常思路,无论使用哪个控件要实现校验效果时都需要对每个 ...
- 在Winform开发框架中,利用DevExpress控件实现数据的快速录入和选择
在实际的项目开发过程中,有好的控件或者功能模块,我都是想办法尽可能集成到我的WInform开发框架中,这样后面开发项目起来,就可以节省很多研究时间,并能重复使用,非常高效方便.在我很早之前的一篇博客& ...
- DevExpress控件开发常用要点(项目总结版)
使用DevExpress控件来做项目开发已经有很长一段时间了,在摸索开发到客户苛刻要求的过程中,其中碰到过很多问题需要解决的,随着一个个问题的解决,也留下很多对DevExpress控件的使用经验及教训 ...
- DevExpress控件使用之RichEditControl的使用
原文:DevExpress控件使用之RichEditControl的使用 做Winform的,我们一般都知道,传统.NET界面有一个RichTextBox控件,这个是一个富文本控件,可以存储图片文字等 ...
- DevExpress控件学习总结(转)
DevExpress控件学习总结 1.Navigation & Layout 1.1 Bar Manager 如果想在窗体或用户控件(user control)上添加工具条(bars)或弹 ...
- DevExpress控件的GridControl控件小结
DevExpress控件的GridControl控件小结 (由于开始使用DevExpress控件了,所以要点滴的记录一下) 1.DevExpress控件组中的GridControl控件不能使横向滚动条 ...
- DevExpress控件安装、汉化使用教程
前言 DevExpress是一个庞大的控件库,也很是好用(没用过,听说),但是要收费. 网上关于DevExpress的教程满天飞,我找了一下午也没找到正确的安装.简单实用教程,还是自己摸索吧. 自己动 ...
- DevExpress控件使用经验总结- GridView列表行号显示操作
DevExpress是一个比较有名的界面控件套件,提供了一系列的界面控件套件的DotNet界面控件.本文主要介绍我在使用DevExpress控件过程中,遇到或者发现的一些问题解决方案,或者也可以所示一 ...
- DevExpress控件-- Gridcontrol合并表头
写在前面的话: 在园子里逛了有一段时间了,一直想写点东西,但苦于自己的水平有限,生怕写出来的东西浪费了读者的时间.楼主有幸参加了公司DevExpress控件的培训,独乐乐不如众乐乐,特附上Demo以飨 ...
随机推荐
- 14.Diameter of Binary Tree(二叉树的直径)
Level: Easy 题目描述: Given a binary tree, you need to compute the length of the diameter of the tree. ...
- 11. 变量提升 && 执行上下文
/* 变量升级 预处理 */ /* js引擎在代码正式执行之前会做一个预处理的工作: 1.收集变量 2.收集函数 依据: var 将var后边的变量定义但不赋值 var username=undefi ...
- appium键盘处理
最近对appium感兴趣,就从网上找了些资料,搭建了环境,下载了appium测试代码和测试apk,这方面的东西晚上再写 appium最新版(v1.4.0.0)已经没有sendKeyEvent了,所以现 ...
- 《C程序设计II》简易计算器,杨辉,数字杯子图形
<C程序设计II>简易计算器,杨辉,数字杯子图形.<C程序设计II>简易计算器,杨辉,数字杯子图形.<C程序设计II>简易计算器,杨辉,数字杯子图形. <C程 ...
- sharepoint_study_7
描述:sharepoint网站上部署WebPart出错后,如何删除错误的WebPart?如何恢复原页面? 解决:到管理中心去将该解决方案收回并删除,可以恢复原页面,但是错误的webpart信息会保留, ...
- P3166 [CQOI2014]数三角形
传送门 直接求还要考虑各种不合法情况,不好计数 很容易想到容斥 把所有可能减去不合法的情况剩下的就是合法情况 那么我们只要任取不同的三点就是所有可能,不合法情况就是三点共线 对于两点 $(x_1,y_ ...
- Avito Cool Challenge 2018:D. Maximum Distance
D. Maximum Distance 题目链接:https://codeforces.com/contest/1081/problem/D 题意: 给出一个连通图以及一些特殊点,现在定义cost(u ...
- 字符串转LocalTime再转Instant
LocalTime a= LocalTime.parse("20:13:01"); // LocalTime a= LocalTime.now(); System.out.prin ...
- tomcat 虚拟目录配置appBase和docBase的区别
先看server.xml文件host配置 <Host name="localhost" appBase="webapps" 可以修改成自己想 ...
- docker(3)docker下的centos7下安装jdk
1.将jdk-8u65-linux-x64.tar.gz文件传到docker的宿主机上 rz 2.将宿主机上的jdk-8u65-linux-x64.tar.gz复制到centos7的容器下 #在宿主机 ...