又是一年清明节至,细雨绵绵犹如泪光,树叶随风摆动....

转眼间,一年又过去了三分之一,疫情的严峻让不少企业就跟清明时节的树叶一样,摇摇欲坠。裁员的裁员,降薪的降薪,996的996~~说起来都是泪,以上种种竟然在本公司都能见到,然而你现在还能看到博主翘着二郎腿,在工位上信誓旦旦的敲着代码也是奇迹!哎,生活不易,且行且珍惜吧!

  Talk is Cheap, Show me the code!

  如上所说,虽环境如此严峻,但也不能生疏了咱吃饭的手艺。不禁让我感受到,对技术的追求,不仅仅靠的是兴趣,更重要的是坚持啊!

  废话少说,前面几个环节,博主分享了对基础控件的封装和扩展(举了几个栗子,大家可以举一反三。或者公众号Call我,源码免费奉上。),后面和大家一起看看对容器控件的封装和扩展,本篇以常用的Dev中GridControl控件的封装和扩展。

  对容器控件的封装和扩展,和其他控件一样。首先,新建一个自定义类,让其继承Dev的GridControl:

  1. public class KzxGridControl : GridControl, IControl

   其次,给需要扩展的属性用特性方式标识,便于在VS设计界面来控制。本篇以最常用的两个功能来进行解析——GridControl右键菜单之复制行和导出Excel.具体核心代码如下:

  1. private bool _displayRightClickCopyMenu = true;
  2. private bool _displayRightClickExportExcel = true;
  3. /// <summary>
  4. /// 是否显示右键菜单的复制行
  5. /// </summary>
  6. [Category("右键菜单"), Description("DisplayRightClickMenu,显示右键菜单的复制行按钮"), Browsable(true)]
  7. public bool DisplayRightClickMenu
  8. {
  9. get { return _displayRightClickCopyMenu; }
  10. set { _displayRightClickCopyMenu = value; }
  11. }
  12. /// <summary>
  13. /// 是否显示右键菜单的导出Excel
  14. /// </summary>
  15. [Category("右键菜单"), Description("DisplayRightExportExcel,显示右键菜单的导出Excel按钮"), Browsable(true)]
  16. public bool DisplayRightExportExcel
  17. {
  18. get { return _displayRightClickExportExcel; }
  19. set { _displayRightClickExportExcel = value; }
  20. }

  编译后,返回设计界面,点击GridControl控件查看属性窗体会发现我们刚刚新增的扩展属性:

  属性设置完毕后,接下来就是初始化绑定该菜单的功能事件。

  1. /// <summary>
  2. /// 构造
  3. /// </summary>
  4. public KzxGridControl()
  5. : base()
  6. {
  7. if (this.MainView == null)
  8. {
  9. this.gridView1 = new DevExpress.XtraGrid.Views.Grid.GridView();
  10. ((System.ComponentModel.ISupportInitialize)(this.gridView1)).BeginInit();
  11. ((System.ComponentModel.ISupportInitialize)(this)).BeginInit();
  12. this.SuspendLayout();
  13. this.gridView1.GridControl = this;
  14. this.gridView1.Name = "gridView1";
  15. this.gridView1.VertScrollVisibility = ScrollVisibility.Always;
  16. this.gridView1.HorzScrollVisibility = ScrollVisibility.Always;
  17. this.MainView = this.gridView1;
  18. this.ViewCollection.AddRange(new DevExpress.XtraGrid.Views.Base.BaseView[] {
  19. this.gridView1});
  20. ((System.ComponentModel.ISupportInitialize)(this.gridView1)).EndInit();
  21. ((System.ComponentModel.ISupportInitialize)(this)).EndInit();
  22. this.ResumeLayout(false);
  23. }
  24.  
  25. this._KzxBandedGridView = new KzxBandedGridView(false, _bandedGridView, this);
  26. this.Load += new EventHandler(GridControl_Load);
  27. }

  构造函数中,绑定load事件,用于触发菜单事件

  1. private void GridControl_Load(object sender, EventArgs e)
  2. {
  3. ToolStripItem item3;
  4. ToolStripItem item4;
  5.  
  6. if (this.ContextMenuStrip == null)
  7. {
  8. this.ContextMenuStrip = new ContextMenuStrip();
  9. }
  10. this._ContextMenuStrip = this.ContextMenuStrip;
  11. _ContextMenuStrip.Opened += _ContextMenuStrip_Opened;
  12. //如果需要显示右键复制行
  13. if (_displayRightClickCopyMenu)
  14. {
  15. item3 = this._ContextMenuStrip.Items.Add(GetLanguage("RMI000452", "复制行"));//复制行
  16. item3.Name = "copyline";
  17. item3.Click += new EventHandler(CopyLine);
  18. }
  19. //如果需要显示右键导出Excel
  20. if (_displayRightClickExportExcel)
  21. {
  22. item4 = this._ContextMenuStrip.Items.Add(GetLanguage("SYS001196", "导出EXCEL"));//导出EXCEL
  23. item4.Click += new EventHandler((s, ee) =>
  24. {
  25. //TODO:导出Excel动作
  26. });
  27. }
  28. ...

  导出方法比比皆是,因项目而异,多表头的,普通的。。就不献丑了(如有需要也可公众号call我,源码免费奉上)。此处我们拿复制行来举栗子,方法如下:

  1. #region 复制行
  2. public void CopyLine(object sender, EventArgs e)
  3. {
  4. StringBuilder sqlsb = new StringBuilder();
  5. GridView gridview = this.MainView as GridView;
  6. DataTable dt = null;
  7. DataColumn[] columns = null;
  8. //BindingSource bs = null;
  9. DataRow row = null;
  10. DataRow rowtemp = null;
  11. //举例是拿DataTable做数据源,所以下面代码暂时屏蔽
  12. //bs = (this.DataSource as BindingSource);
  13. if (this.DataSource != null)
  14. {
  15. if (gridview.FocusedRowHandle >= )
  16. {
  17. row = gridview.GetDataRow(gridview.FocusedRowHandle);
  18. dt = ((this.DataSource as DataTable).DefaultView as DataView).Table;
  19. if (dt.PrimaryKey != null)
  20. {
  21. columns = dt.PrimaryKey;
  22. }
  23.  
  24. DataTable dttemp = dt.Clone();
  25. rowtemp = dttemp.Rows.Add(row.ItemArray);
  26. foreach (DataColumn c in columns)
  27. {
  28. rowtemp[c.ColumnName] = Guid.NewGuid();
  29. }
  30. //判断iOrder是否存在,存在则不复制,且取最大值+1
  31. if (dt.Columns.Contains("iOrder"))
  32. {
  33. int maxIOrder = string.IsNullOrWhiteSpace(dt.Compute("max(iOrder)", "1=1").ToString()) ? : Convert.ToInt32(dt.Compute("max(iOrder)", "1=1").ToString());
  34. rowtemp["iOrder"] = maxIOrder + ;
  35. }
  36. dt.ImportRow(rowtemp);
  37.  
  38. //执行右键复制行委托
  39. OnRowCopy?.Invoke();
  40. }
  41. }
  42. else
  43. {
  44. KzxMessageBox.Show(sysClass.ssLoadMsgOrDefault("MSG002204", "数据源不能为空"));
  45. }
  46. }
  47. #endregion
  1. private void CopyLineMenu()
  2. {
  3. //是否显示右键的复制行按钮
  4. if (this._displayRightClickCopyMenu == true)
  5. {
  6. bool iscontain = false;
  7. ToolStripItem item3;
  8. if (this.ContextMenuStrip == null)
  9. {
  10. this.ContextMenuStrip = new ContextMenuStrip();
  11. }
  12. this._ContextMenuStrip = this.ContextMenuStrip;
  13. for (int i = ; i < this._ContextMenuStrip.Items.Count; i++)
  14. {
  15. if (this._ContextMenuStrip.Items[i].Name.Equals("copyline", StringComparison.OrdinalIgnoreCase) == true)
  16. {
  17. iscontain = true;
  18. break;
  19. }
  20. }
  21. if (iscontain == false)
  22. {
  23. item3 = this._ContextMenuStrip.Items.Add(GetLanguage("RMI000452", "复制行"));//复制行
  24. item3.Name = "copyline";
  25. item3.Click += new EventHandler(CopyLine);
  26. }
  27. }
  28. }

  具体效果如下:

  完成!不过注意,以上功能如果运用于实际项目,烦请做好控制,尤其复制行功能,初衷是一个很复杂的GridControl十几二十多列的,不想一列一列输入的,可以采用这种模式,复制行后改动下即可。注意最好是在编辑状态下显示此操作,否则不仅不会保存到数据库,还白费功夫!此本只是演示效果而已!本篇到此结束...

最后,由于后续所有重写/重绘控件都在同一个项目使用,而且Dev系统引用文件较多,压缩后源码文件仍然很大,如果有需要源码的朋友,可以微信公众号联系博主,源码可以免费赠予~!有疑问的也可以CALL我一起探讨。

  最最后,感谢您的耐心陪伴!如果觉得本篇博文对您或者身边朋友有帮助的,麻烦点个关注!赠人玫瑰,手留余香,您的支持就是我写作最大的动力,感谢您的关注,期待和您一起探讨!再会!

玩转控件:对Dev中GridControl控件的封装和扩展的更多相关文章

  1. 玩转控件:对Dev的GridControl控件扩展

    缘由 一切实现来源于需求,目的在于不盲目造轮子,有小伙伴儿在看了<玩转控件:对Dev中GridControl控件的封装和扩展>文章后,私信作者说,因公司业务逻辑比较复杂,展示字段比较多,尤 ...

  2. Dev中GridControl的导出Excel设置

    接上篇 Dev中GridControl的GridView 基本样式设置 上图: 导出部分的代码: /// <summary> /// 导出excel /// </summary> ...

  3. Dev的GridControl控件选择框的使用

    先介绍环境:VS2010,dev11.2 想要达到的效果:,当单击某一行时前面的选择框选中. 在网上找了不少,但是感觉跟我想的做法很不一样(有很多都是再另外添加一个什么CheckBox,这个我在Dev ...

  4. 关于Devexpress15.2中GridControl控件选择字段ColumnEdit下拉时间设置

    效果:点击表格GridControl控件中的列,可以显示日期和时间.时间可以手动修改.(绑定日期格式的字段) 设置步骤:1.点击时间字段列表设置ColumnEdit-New-选择DateEdit出现r ...

  5. dev中gridview控件 z

    目录:一.客户端常用1.常用API2.聚焦行变更事件3.客户端选择多行4.客户端选择行5. 获取选择的行数目6.单击行时,选中行7.通过checkbox 选择行8.选择所有行9.启动编辑框,Conta ...

  6. DEV的GridControl控件的选中列属性设置高光

    设置Run Designer=>Views=> OptionsSelection下面的: EnableAppearanceFocusedCell = False,//鼠标移开,失去焦点,仍 ...

  7. C# WinfForm 控件之dev表格 GridControl

    基本用法 1.新建一个winformAPP 放一个gridControl 为gridC 再放一个button 用法与dataGrid一样 代码如下: /// <summary> /// 显 ...

  8. Dev中GridControl的GridView 基本样式设置

    基本样式图: 代码如下: /// <summary> /// gridView样式 /// </summary> /// <param name="gdv&qu ...

  9. Dev中gridControl修改列为按钮

    (1)点击Run Designer (2)点击要修改的列,把列的ColumnEdit属性设置为RepositoryItemButtonEdit (3)把TextEditStyle属性设置为HideTe ...

随机推荐

  1. 设计模式详解及PHP实现:代理模式

    [目录] 代理模式(Proxy pattern) 代理模式是一种结构型模式,它可以为其他对象提供一种代理以控制对这个对象的访问. 主要角色 抽象主题角色(Subject):它的作用是统一接口.此角色定 ...

  2. mysql长连接与短连接

    什么是长连接? 其实长连接是相对于通常的短连接而说的,也就是长时间保持客户端与服务端的连接状态. 通常的短连接操作步骤是: 连接->数据传输->关闭连接: 而长连接通常就是: 连接-> ...

  3. C与C++面试易出知识点

    .1. char c = '\72'; 中的\72代表一个字符,72是八进制数,代表ASCII码字符":". 2. 10*a++ 中a先进行乘法运算再自增(笔试中经常喜欢出这类运算 ...

  4. windows 10 右键菜单注册表位置

    1. 查找 1.1. 打开注册表 # 1. 使用快捷键打开 “运行” win + r # 2. 在 “运行” 中输入 regedit # 3. 回车 1.2. 点击 查找 # 1. 方法 1 : 点击 ...

  5. Swfit 属性与汇编分析inout本质

    今天将讲述Swift属性以及剖析inout的本质, 如有兴趣可点击关注,以后会定期更新更有料的博客!!! 一.属性 Swift中跟实例相关的属性可以分为2大类 存储属性(Stored property ...

  6. 02 JPA

    JPA概述 JPA的全称是Java Persistence API, 即Java 持久化API,是SUN公司推出的一套基于ORM的规范,内部是由一系列的接口和抽象类构成.       JPA通过JDK ...

  7. flink RPC(akka)

    flink中的rpc框架使用的akka.在本节并不详细讲述akka,而是就flink中rpc来讲述akka的部分内容.本节,我从AkkaRpcActor.handleRpcInvocation方法讲起 ...

  8. Linux定制化RPM包

    定制化RPM包 1.Linux安装软件方法 1- rpm/yum安装 简单.速度快,但是不能定制安装 RPM RedHat Package Manager(RPM软件包管理器) 2- 二进制安装 解压 ...

  9. Python实现对excel的操作

    1.操作excel使用第三方库openpyxl安装:pip install openpyxy引入:import openpyxl2.常用简单操作1)打开excel文件获取工作簿wb = openpyx ...

  10. javaScript 基础知识汇总(七)

    1.数组 特点:数组是可以存储有序集合的对象. 声明: let arr = new Array();   let arr=[]; 大多数情况下我们使用第二种. let fruits = [" ...