缘由

一切实现来源于需求,目的在于不盲目造轮子,有小伙伴儿在看了《玩转控件:对Dev中GridControl控件的封装和扩展》文章后,私信作者说,因公司业务逻辑比较复杂,展示字段比较多,尤其网格列表控件展示数据太多时候,很多关键列信息不同用户要求展示效果不同,问我有没有好点的处理方式来满足不同客户的需求。

看到这里作者还是比较暗自窃喜的,毕竟自己造的轮子不止作者一个人在用,而且还能收获客户的实际需求来完善轮子。当然客户需求存在即合理。毕竟There are a thousand Hamlets in a thousand people's eyes.

何以解忧唯有撸码

有了需求,眼球一转,就撸起袖子加油干吧。初步想法直接在《玩转控件:对Dev中GridControl控件的封装和扩展》的基础上,右键菜单网格设置状态里面处理吧。把处理后的结果通过配置文件方式(ini,xml...)存储起来,网格加载的时候,通过校验是否存在配置文件来加载不同客户的配置信息即可。    有了想法,就行动起来吧!气运丹田,双手摊开,扎下马步,使出"拖控件大法"一气呵成!

大致需求与实现如上图,本来还有列中文列名的,但是客户说不要~~(如有更多不同需求或更好的想法,请自行添加或者公众号私信作者一起探讨),

Talk is Cheap,Show me the Code

跟用户反复沟通,具体效果图如上,下面一起看看是如何实现的。

思路:网格表格右键点击网格状态设置,弹出如上设置窗体,窗体界面加载的时候绑定GridControl所有数据列,并在保存时候存储到配置文件中,具体代码如下:

  /// <summary>/// 数据加载初始化/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void frm_GridSetting_Load(object sender, EventArgs e){//读取配置文件,更新网格状态string sPath = $@"{ Application.StartupPath}\Task.xml";DataTable dtColumns = this.gc.DataSource as DataTable;GridView gvv = gc.MainView as GridView; if (dtColumns != null && dtColumns.Rows.Count > 0){DataTable dtSetting = new DataTable("GridSetting");dtSetting.Columns.Add("ColumnsName", typeof(String));dtSetting.Columns.Add("isDisplay", typeof(Boolean));dtSetting.Columns.Add("Freeze", typeof(String));dtSetting.Columns.Add("ColumnsWidth", typeof(Int32));dtSetting.Columns.Add("Order1", typeof(String));dtSetting.Columns.Add("Order2", typeof(String));dtSetting.Columns.Add("Top", typeof(String));dtSetting.Columns.Add("Button", typeof(String));dtSetting.Columns.Add("iOrder", typeof(Int32));if (!File.Exists(sPath)){ for (int i = 0; i < gvv.VisibleColumns.Count; i++){string colName = gvv.VisibleColumns[i].Name.Replace("col", "");dtSetting.Rows.Add(new object[] { colName, true, "无", 120, "上移", "下移", "置顶", "置底", gvv.VisibleColumns[i].VisibleIndex });}}else{//读取XML 绑定数据源XDocument xdoc = XDocument.Load(sPath);var query = from a in xdoc.Descendants("Columns")select new{ColumnsName = a.Attribute("ColumnsName").Value,isDisplay = a.Element("isDisplay").Value,Freeze = a.Element("Freeze").Value,ColumnsWidth = a.Element("ColumnsWidth").Value,iOrder = a.Element("iOrder").Value};int index = 0;foreach (var item in query.ToList()){dtSetting.Rows.Add(new object[] { item.ColumnsName, Boolean.Parse(item.isDisplay), item.Freeze, int.Parse(item.ColumnsWidth), "上移", "下移", "置顶", "置底", index });index++;//排序重置}}gcSetting.DataSource = dtSetting;repositoryItemButtonEdit1.ButtonClick += RepositoryItemButtonEdit1_ButtonClick;//上移 repositoryItemButtonEdit2.ButtonClick += RepositoryItemButtonEdit2_ButtonClick;//下移 repositoryItemButtonEdit3.ButtonClick += RepositoryItemButtonEdit3_ButtonClick;//置顶 repositoryItemButtonEdit4.ButtonClick += RepositoryItemButtonEdit4_ButtonClick;//置底 }}

网格窗体点击确认,用来保存用户的配置信息:

 /// <summary>
/// 确定
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnSure_Click(object sender, EventArgs e)
{try{//保存动作string sPath = $@"{ Application.StartupPath}\Task.xml";loop:if (!File.Exists(sPath)){File.Create(sPath).Close();XDocument xdoc = new XDocument();//创建跟节点XElement root = new XElement("Mes");//添加跟节点xdoc.Add(root);DataTable dtSetting = gcSetting.DataSource as DataTable;int index = 0;foreach (DataRow item in dtSetting.Rows){//创建person节点 XElement per = new XElement("Columns");//添加person节点root.Add(per);//创建属性节点XAttribute ColumnsName = new XAttribute("ColumnsName", item["ColumnsName"].ToString());//name节点XElement isDisplay = new XElement("isDisplay", item["isDisplay"].ToString());XElement Freeze = new XElement("Freeze", item["Freeze"].ToString());XElement ColumnsWidth = new XElement("ColumnsWidth", item["ColumnsWidth"].ToString());XElement iOrder = new XElement("iOrder", index);//对person节点添加id属性 以及name sex age节点per.Add(ColumnsName, isDisplay, Freeze, ColumnsWidth, iOrder);index++;}//保存linq to xml 文件xdoc.Save(sPath);}else{File.Delete(sPath);goto loop;}//刷新原始界面显示if (RefreshMDIFormEvent != null){RefreshMDIFormEvent();}}catch (Exception ex){}finally{this.Close();}
}

因最近项目上线,时间紧迫(吃饭时间写的博客)。作者就偷个懒,每次确认都会先删除配置文件,然后重新新增。实际项目中可以通过更新来处理。而且goto语法也比较low,大家将就着看下效果,具体更好实现,伙伴们可以自行重写。唯一值得注意的点是File文件流的问题,此处偷懒写法

File.Create(sPath).Close();

防止保存配置文件的时候,提示文件被其他用户占用的问题。至于上移,下移,置顶,置底等功能网上很多示例,也可以公众号私聊作者,所有源码免费赠送。配置文件如图:

配置界面梳理完毕,只需要在主窗体数据加载后,读取配置文件信息变更即可:

 kzxGridControl1.DataSource = dataTable;
GridView gv = this.kzxGridControl1.MainView as GridView;
//读取配置文件,更新网格状态
string sPath = $@"{ Application.StartupPath}\Task.xml";
if (File.Exists(sPath))
{XDocument xdoc = XDocument.Load(sPath);for (int i = 0; i < gv.Columns.Count; i++){string colName = gv.Columns[i].Name.Replace("col", "");var query = (from a in xdoc.Descendants("Columns")where a.Attribute("ColumnsName").Value == colNameselect new{isDisplay = a.Element("isDisplay").Value,Freeze = a.Element("Freeze").Value,ColumnsWidth = a.Element("ColumnsWidth").Value,iOrder = a.Element("iOrder").Value}).FirstOrDefault();if (query != null){gv.Columns[i].Visible = Boolean.Parse(query.isDisplay);if (query.Freeze.ToLower().Equals("无")){gv.Columns[i].Fixed = FixedStyle.None;}else if (query.Freeze.ToLower().Equals("左边")){gv.Columns[i].Fixed = FixedStyle.Left;}else if (query.Freeze.ToLower().Equals("右边")){gv.Columns[i].Fixed = FixedStyle.Right;}if (!Boolean.Parse(query.isDisplay)){gv.Columns[i].VisibleIndex = -1;gv.Columns[i].Visible = Boolean.Parse(query.isDisplay);}else{gv.Columns[i].VisibleIndex = int.Parse(query.iOrder);}gv.Columns[i].Width = int.Parse(query.ColumnsWidth);}}
}

为了能实时更新配置效果,可在配置窗体添加个委托用于刷新主界面数据:

 public delegate void RefreshMDIFormHandler();
public event RefreshMDIFormHandler RefreshMDIFormEvent;
 /// <summary>
/// 网格状态设置
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void kzxSimpleButton2_Click(object sender, EventArgs e)
{frm_GridSetting frm = new frm_GridSetting(kzxGridControl1);frm.RefreshMDIFormEvent += Frm_RefreshMDIFormEvent;frm.ShowDialog();
}private void Frm_RefreshMDIFormEvent()
{this.frm_ShowControl_Load(null, null);
}

时间紧急,处理的比较粗糙,直接调用load重新加载了。

完成!所有实现处理完成,来一起看看效果:

(效果原图)

(Email列置顶效果)

(TelePhone上移,确定后效果)

(隐藏列效果)

(设置列宽效果)

(列冻结效果)

(列冻结效果2)

为了后续其他控件加载问题,本篇用按钮方式实现的弹窗,有需求的伙伴们可以把相关代码移动到GridContrl用户控件的右键菜单中实现。此处不在过多阐述。谢谢屏幕前您的耐心陪伴!

结束语

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

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

玩转控件:对Dev的GridControl控件扩展相关推荐

  1. 玩转控件:对Dev中GridControl控件的封装和扩展

    清明节 清明时节雨纷纷 路上行人欲断魂 借问酒家何处有 牧童遥指杏花村 又是一年清明节至,细雨绵绵犹如泪光,树叶随风摆动.... 转眼间,一年又过去了三分之一,疫情的严峻让不少企业就跟清明时节的树叶一 ...

  2. Developer Express控件组合中的GridControl控件,如何自动显示每一行的序号

    Developer Express控件组合中的GridControl控件,如何自动显示每一行的序号? 比方说有10条数据记录,我要在记录旁边显示1.2.3.4.这样的数字. 但是,如果更改了数据记录的 ...

  3. DevExpress表格控件(GridView、GridControl)使用小结

    GridControl创建表格 1.点击VS"工具箱"的GridControl,在窗体上添加此控件: 2.点击"RunDesigner"按钮,进入表格设计界面, ...

  4. WPF GridControl控件的用法举例

    01 - 前言 WPF中自带的表格控件是DataGrid,但是格式并不是很美观,我们一般用 Dev中类似的控件GridControl来取代,这个控件功能相当强大. WPF数据网格(GridContro ...

  5. DevExpress控件之GridControl控件

    DevExpress控件之GridControl控件 http://blog.sina.com.cn/s/blog_6769068d0100iucx.html 1.  设置数据源: string sq ...

  6. gridControl控件的gridView实现全选

    实现默认全选 1:设置GridControl控件允许选择多行 Run Designer ->Options->OptionsSelection->MultiSelect=true 2 ...

  7. DevExpress GridControl 控件中GridView 加组,加行

    DevExpress GridControl 控件是经常会用到  加组 加行功能 扩展方法 public static class Tools {/// <summary>/// 加组// ...

  8. DevExpress的GridControl控件筛选行自动筛选模式

    DevExpress的GridControl控件筛选行过滤行自动筛选过滤模式修改为"包含"模式 方法: 设置列的过滤属性为"包含",属性值为枚举类型 forea ...

  9. 原创“.NET研究”企业级控件库之图片浏览控件

    在上两篇:我介绍了原创企业级控件库之组合查询控件 和原创企业级控件库之大数据量分页控件,受到了很多朋友的支持,给了我很大的动力,在此我特表感谢.有的朋友要求把源码提供上来,我在第一篇就讲了,源码会在我 ...

最新文章

  1. RabbitMQ 延迟队列,太实用了!
  2. 央视深入报道,国内主流芯片真实水平如何?
  3. python fabric使用
  4. python开发是不是苦累_Python 2.7 辛苦了,你好Python 3.7
  5. MyBatis 源码解读-objectFactoryElement()、objectWrapperFactoryElement()
  6. 使用Vitamio打造自己的Android万能播放器(1)——准备
  7. OPA 5 - CreateButtonTest creates CreateButtonSteps
  8. Ubuntu 14.04 LTS 下升级 gcc 到 gcc-4.9、gcc-5 版本
  9. java setsolinger_java socket 的参数选项解读(转)
  10. c++语言表白超炫图形_C/C++图形界面编程打造——浪漫的表白程序!
  11. oppo手机计算机,OPPO手机助手
  12. 下面属于python内置对象的有哪些_Python内置对象实现的方法及注意事项
  13. Java中导入Excel文件
  14. JBPM开发入门指南(3)
  15. 删除python读取的txt每一行尾部的\n
  16. Exp3免杀原理与实践 20154326杨茜
  17. 8021x 获取IP信息失败,请检查锐捷认证客户端当前配置是否符合所在网络的要求,检查完毕后尝试重新认证...
  18. VUE 中使用 Element 时间控件(简单上手)
  19. 拿下国产高端市场第一背后,vivo与苹果、华为的共性
  20. Java API II

热门文章

  1. picturebox 图片自适应
  2. java轻量级Http Server
  3. c语言编手机蓝牙软件的代码,51单片机C语言的简易蓝牙锁代码
  4. Teams App 如何使用设备的能力
  5. Haproxy安装与配置
  6. Centos6.8 安装spark-2.3.1 以及 scala-2.12.2
  7. 写一个易于维护使用方便性能可靠的Hybrid框架(一)—— 思路构建
  8. weblogic清除缓存
  9. JSTL分割字符 fn:split()
  10. iNeuOS工业互联网操作系统,顺利从NetCore3.1升级到Net6的过程汇报,发布3.7版本...