业务需求:

业务工作中经常需要对表格中的数据进行处理,包括过滤、复合计算等。过滤需要有过滤条件,复合计算需要计算公式。这两种场景都需要一个表达式编辑器。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控件扩展之表达式编辑器的更多相关文章

  1. 扩展方法实现DevExpress控件校验

    DevExpress控件中,如果要控件的值进行校验,需要用到DXValidationProvider控件和DXErrorProvider控件,按照正常思路,无论使用哪个控件要实现校验效果时都需要对每个 ...

  2. 在Winform开发框架中,利用DevExpress控件实现数据的快速录入和选择

    在实际的项目开发过程中,有好的控件或者功能模块,我都是想办法尽可能集成到我的WInform开发框架中,这样后面开发项目起来,就可以节省很多研究时间,并能重复使用,非常高效方便.在我很早之前的一篇博客& ...

  3. DevExpress控件开发常用要点(项目总结版)

    使用DevExpress控件来做项目开发已经有很长一段时间了,在摸索开发到客户苛刻要求的过程中,其中碰到过很多问题需要解决的,随着一个个问题的解决,也留下很多对DevExpress控件的使用经验及教训 ...

  4. DevExpress控件使用之RichEditControl的使用

    原文:DevExpress控件使用之RichEditControl的使用 做Winform的,我们一般都知道,传统.NET界面有一个RichTextBox控件,这个是一个富文本控件,可以存储图片文字等 ...

  5. DevExpress控件学习总结(转)

    DevExpress控件学习总结   1.Navigation & Layout 1.1 Bar Manager 如果想在窗体或用户控件(user control)上添加工具条(bars)或弹 ...

  6. DevExpress控件的GridControl控件小结

    DevExpress控件的GridControl控件小结 (由于开始使用DevExpress控件了,所以要点滴的记录一下) 1.DevExpress控件组中的GridControl控件不能使横向滚动条 ...

  7. DevExpress控件安装、汉化使用教程

    前言 DevExpress是一个庞大的控件库,也很是好用(没用过,听说),但是要收费. 网上关于DevExpress的教程满天飞,我找了一下午也没找到正确的安装.简单实用教程,还是自己摸索吧. 自己动 ...

  8. DevExpress控件使用经验总结- GridView列表行号显示操作

    DevExpress是一个比较有名的界面控件套件,提供了一系列的界面控件套件的DotNet界面控件.本文主要介绍我在使用DevExpress控件过程中,遇到或者发现的一些问题解决方案,或者也可以所示一 ...

  9. DevExpress控件-- Gridcontrol合并表头

    写在前面的话: 在园子里逛了有一段时间了,一直想写点东西,但苦于自己的水平有限,生怕写出来的东西浪费了读者的时间.楼主有幸参加了公司DevExpress控件的培训,独乐乐不如众乐乐,特附上Demo以飨 ...

随机推荐

  1. linux curl命令:curl: (7) couldn't connect to host ?

    linux curl命令:curl: (7) couldn't connect to host ? 使用linux命令 curl http://www.test.com 出现如下错误:curl: (7 ...

  2. Ruby truthy and falsey

    在Ruby里只有false 和nil表示falsey link: https://gist.github.com/jfarmer/2647362

  3. Django之ORM其他骚操作 执行原生SQl

      Django ORM执行原生SQL # extra # 在QuerySet的基础上继续执行子语句 # extra(self, select=None, where=None, params=Non ...

  4. spoj COT - Count on a tree(主席树 +lca,树上第K大)

    您将获得一个包含N个节点的树.树节点的编号从1到Ñ.每个节点都有一个整数权重. 我们会要求您执行以下操作: uvk:询问从节点u到节点v的路径上的第k个最小权重 输入 在第一行中有两个整数Ñ和中号.( ...

  5. day32 线程

    1.     线程是什么,有了进程为什么还要线程 进程有很多优点,它提供了多道编程,让我们感觉我们每个人都拥有自己的CPU和其他资源,可以提高计算机的利用率.很多人就不理解了,既然进程这么优秀,为什么 ...

  6. MessageFormat 格式化String

    public static String buildFailureString(AtomicInteger count, String cause) { return MessageFormat.fo ...

  7. Linux下如何使用Wireshark进行抓包

    1. 安装wireshark Ubuntu 14.04.3 缺省安装后, 不包含Wireshark抓包软件,因此首先需要手工进行Wireshark的安装:     apt-get update apt ...

  8. chrome浏览器解决 跨域调试问题

    1.关闭chrome浏览器(全部) 我们可以通过使用chrome命令行启动参数来改变chrome浏览器的设置,具体的启动参数说明参考这篇介绍.https://code.google.com/p/xia ...

  9. Murano Weekly Meeting 2015.08.25

    Meeting time: 2015.August.25th 1:00~2:00 Chairperson:  Serg Melikyan, PTL from Mirantis Meeting summ ...

  10. escape、encodeURI以及encodeURIComponent

    在标准中,只有字母和数字[0-9a-zA-Z].一些特殊符号"$-_.+!*'(),"[不包括双引号].以及某些保留字,才可以不经过编码直接用于URL.但是比如我们搜索时,往往会输 ...