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以飨 ...
随机推荐
- CF959C Mahmoud and Ehab and the wrong algorithm 构造
Mahmoud was trying to solve the vertex cover problem on trees. The problem statement is: Given an un ...
- linux 虚拟环境问题
1.python环境 python2和python3命令用来区分python版本 pip2和pip3命令用来区分pip,你的包到底安装在哪里pip3 install xxx sudo apt inst ...
- Python-5-字符串方法
center >>> "The Middle by Jimmy Eat World".center(39) ' The Middle by Jimmy E ...
- java学习内容整理
转自:http://www.cnblogs.com/caoleiCoding/p/6170555.html 首先,我个人比较推崇的学习方法是:先学java前段,也就是HTML,css,js,因为学习j ...
- import与from...import...的区别
from ... import ... 的用法和直接import的区别: 1.直接使用import时,如果需要使用到导入模块内的属性和方法,必须使用模块名.属性和模块名.方法的方式进行调用 2.使用f ...
- Linux内核硬件访问技术
① 驱动程序控制设备,主要是通过访问设备内的寄存器来达到控制目的.因此我们讨论如何访问硬件,就成了如何访问这些寄存器. ② 在Linux系统中,无论是内核程序还是应用程序,都只能使用虚拟地址,而芯片手 ...
- 初始 D2 Admin
1.安装D2 admin 输入:npm install -g @d2-admin/d2-admin-cli 2.创建D2 项目 ,可以选择简洁版或者完整版 输入:d2 create 3.然后 进入创建 ...
- C++: int int& int * int**的区别、联系和用途
1.int; int是C++关键字,表示整型,其大小是32位有符号整型,表示的范围是-2,147,483,648 到 2,147,483,647:在声明和定义变量时使用,它表示的意思是所声明或所定义的 ...
- 德国生活tips
提要: 在德国生活也近7个月的时间了,简单给准备来德国留学,生活或者是旅游的人写一些小tips.想到什么就写什么咯. (1)德国交通篇 在德国,交通是第一要点,一般大家都会看到城市里有Straßenb ...
- 关于vue路由嵌套遇到的坑~
关键在于子路由中的path问题,path之前不要放/ <!DOCTYPE html> <html lang="en"> <head> <m ...