玩转控件:对Dev中GridControl控件的封装和扩展
又是一年清明节至,细雨绵绵犹如泪光,树叶随风摆动....
转眼间,一年又过去了三分之一,疫情的严峻让不少企业就跟清明时节的树叶一样,摇摇欲坠。裁员的裁员,降薪的降薪,996的996~~说起来都是泪,以上种种竟然在本公司都能见到,然而你现在还能看到博主翘着二郎腿,在工位上信誓旦旦的敲着代码也是奇迹!哎,生活不易,且行且珍惜吧!
Talk is Cheap, Show me the code!
如上所说,虽环境如此严峻,但也不能生疏了咱吃饭的手艺。不禁让我感受到,对技术的追求,不仅仅靠的是兴趣,更重要的是坚持啊!
废话少说,前面几个环节,博主分享了对基础控件的封装和扩展(举了几个栗子,大家可以举一反三。或者公众号Call我,源码免费奉上。),后面和大家一起看看对容器控件的封装和扩展,本篇以常用的Dev中GridControl控件的封装和扩展。
对容器控件的封装和扩展,和其他控件一样。首先,新建一个自定义类,让其继承Dev的GridControl:
public class KzxGridControl : GridControl, IControl
其次,给需要扩展的属性用特性方式标识,便于在VS设计界面来控制。本篇以最常用的两个功能来进行解析——GridControl右键菜单之复制行和导出Excel.具体核心代码如下:
private bool _displayRightClickCopyMenu = true;
private bool _displayRightClickExportExcel = true;
/// <summary>
/// 是否显示右键菜单的复制行
/// </summary>
[Category("右键菜单"), Description("DisplayRightClickMenu,显示右键菜单的复制行按钮"), Browsable(true)]
public bool DisplayRightClickMenu
{
get { return _displayRightClickCopyMenu; }
set { _displayRightClickCopyMenu = value; }
}
/// <summary>
/// 是否显示右键菜单的导出Excel
/// </summary>
[Category("右键菜单"), Description("DisplayRightExportExcel,显示右键菜单的导出Excel按钮"), Browsable(true)]
public bool DisplayRightExportExcel
{
get { return _displayRightClickExportExcel; }
set { _displayRightClickExportExcel = value; }
}
编译后,返回设计界面,点击GridControl控件查看属性窗体会发现我们刚刚新增的扩展属性:

属性设置完毕后,接下来就是初始化绑定该菜单的功能事件。
/// <summary>
/// 构造
/// </summary>
public KzxGridControl()
: base()
{
if (this.MainView == null)
{
this.gridView1 = new DevExpress.XtraGrid.Views.Grid.GridView();
((System.ComponentModel.ISupportInitialize)(this.gridView1)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this)).BeginInit();
this.SuspendLayout();
this.gridView1.GridControl = this;
this.gridView1.Name = "gridView1";
this.gridView1.VertScrollVisibility = ScrollVisibility.Always;
this.gridView1.HorzScrollVisibility = ScrollVisibility.Always;
this.MainView = this.gridView1;
this.ViewCollection.AddRange(new DevExpress.XtraGrid.Views.Base.BaseView[] {
this.gridView1});
((System.ComponentModel.ISupportInitialize)(this.gridView1)).EndInit();
((System.ComponentModel.ISupportInitialize)(this)).EndInit();
this.ResumeLayout(false);
} this._KzxBandedGridView = new KzxBandedGridView(false, _bandedGridView, this);
this.Load += new EventHandler(GridControl_Load);
}
构造函数中,绑定load事件,用于触发菜单事件
private void GridControl_Load(object sender, EventArgs e)
{
ToolStripItem item3;
ToolStripItem item4; if (this.ContextMenuStrip == null)
{
this.ContextMenuStrip = new ContextMenuStrip();
}
this._ContextMenuStrip = this.ContextMenuStrip;
_ContextMenuStrip.Opened += _ContextMenuStrip_Opened;
//如果需要显示右键复制行
if (_displayRightClickCopyMenu)
{
item3 = this._ContextMenuStrip.Items.Add(GetLanguage("RMI000452", "复制行"));//复制行
item3.Name = "copyline";
item3.Click += new EventHandler(CopyLine);
}
//如果需要显示右键导出Excel
if (_displayRightClickExportExcel)
{
item4 = this._ContextMenuStrip.Items.Add(GetLanguage("SYS001196", "导出EXCEL"));//导出EXCEL
item4.Click += new EventHandler((s, ee) =>
{
//TODO:导出Excel动作
});
}
...
导出方法比比皆是,因项目而异,多表头的,普通的。。就不献丑了(如有需要也可公众号call我,源码免费奉上)。此处我们拿复制行来举栗子,方法如下:
#region 复制行
public void CopyLine(object sender, EventArgs e)
{
StringBuilder sqlsb = new StringBuilder();
GridView gridview = this.MainView as GridView;
DataTable dt = null;
DataColumn[] columns = null;
//BindingSource bs = null;
DataRow row = null;
DataRow rowtemp = null;
//举例是拿DataTable做数据源,所以下面代码暂时屏蔽
//bs = (this.DataSource as BindingSource);
if (this.DataSource != null)
{
if (gridview.FocusedRowHandle >= )
{
row = gridview.GetDataRow(gridview.FocusedRowHandle);
dt = ((this.DataSource as DataTable).DefaultView as DataView).Table;
if (dt.PrimaryKey != null)
{
columns = dt.PrimaryKey;
} DataTable dttemp = dt.Clone();
rowtemp = dttemp.Rows.Add(row.ItemArray);
foreach (DataColumn c in columns)
{
rowtemp[c.ColumnName] = Guid.NewGuid();
}
//判断iOrder是否存在,存在则不复制,且取最大值+1
if (dt.Columns.Contains("iOrder"))
{
int maxIOrder = string.IsNullOrWhiteSpace(dt.Compute("max(iOrder)", "1=1").ToString()) ? : Convert.ToInt32(dt.Compute("max(iOrder)", "1=1").ToString());
rowtemp["iOrder"] = maxIOrder + ;
}
dt.ImportRow(rowtemp); //执行右键复制行委托
OnRowCopy?.Invoke();
}
}
else
{
KzxMessageBox.Show(sysClass.ssLoadMsgOrDefault("MSG002204", "数据源不能为空"));
}
}
#endregion
private void CopyLineMenu()
{
//是否显示右键的复制行按钮
if (this._displayRightClickCopyMenu == true)
{
bool iscontain = false;
ToolStripItem item3;
if (this.ContextMenuStrip == null)
{
this.ContextMenuStrip = new ContextMenuStrip();
}
this._ContextMenuStrip = this.ContextMenuStrip;
for (int i = ; i < this._ContextMenuStrip.Items.Count; i++)
{
if (this._ContextMenuStrip.Items[i].Name.Equals("copyline", StringComparison.OrdinalIgnoreCase) == true)
{
iscontain = true;
break;
}
}
if (iscontain == false)
{
item3 = this._ContextMenuStrip.Items.Add(GetLanguage("RMI000452", "复制行"));//复制行
item3.Name = "copyline";
item3.Click += new EventHandler(CopyLine);
}
}
}
具体效果如下:


完成!不过注意,以上功能如果运用于实际项目,烦请做好控制,尤其复制行功能,初衷是一个很复杂的GridControl十几二十多列的,不想一列一列输入的,可以采用这种模式,复制行后改动下即可。注意最好是在编辑状态下显示此操作,否则不仅不会保存到数据库,还白费功夫!此本只是演示效果而已!本篇到此结束...
最后,由于后续所有重写/重绘控件都在同一个项目使用,而且Dev系统引用文件较多,压缩后源码文件仍然很大,如果有需要源码的朋友,可以微信公众号联系博主,源码可以免费赠予~!有疑问的也可以CALL我一起探讨。
最最后,感谢您的耐心陪伴!如果觉得本篇博文对您或者身边朋友有帮助的,麻烦点个关注!赠人玫瑰,手留余香,您的支持就是我写作最大的动力,感谢您的关注,期待和您一起探讨!再会!
玩转控件:对Dev中GridControl控件的封装和扩展的更多相关文章
- 玩转控件:对Dev的GridControl控件扩展
缘由 一切实现来源于需求,目的在于不盲目造轮子,有小伙伴儿在看了<玩转控件:对Dev中GridControl控件的封装和扩展>文章后,私信作者说,因公司业务逻辑比较复杂,展示字段比较多,尤 ...
- Dev中GridControl的导出Excel设置
接上篇 Dev中GridControl的GridView 基本样式设置 上图: 导出部分的代码: /// <summary> /// 导出excel /// </summary> ...
- Dev的GridControl控件选择框的使用
先介绍环境:VS2010,dev11.2 想要达到的效果:,当单击某一行时前面的选择框选中. 在网上找了不少,但是感觉跟我想的做法很不一样(有很多都是再另外添加一个什么CheckBox,这个我在Dev ...
- 关于Devexpress15.2中GridControl控件选择字段ColumnEdit下拉时间设置
效果:点击表格GridControl控件中的列,可以显示日期和时间.时间可以手动修改.(绑定日期格式的字段) 设置步骤:1.点击时间字段列表设置ColumnEdit-New-选择DateEdit出现r ...
- dev中gridview控件 z
目录:一.客户端常用1.常用API2.聚焦行变更事件3.客户端选择多行4.客户端选择行5. 获取选择的行数目6.单击行时,选中行7.通过checkbox 选择行8.选择所有行9.启动编辑框,Conta ...
- DEV的GridControl控件的选中列属性设置高光
设置Run Designer=>Views=> OptionsSelection下面的: EnableAppearanceFocusedCell = False,//鼠标移开,失去焦点,仍 ...
- C# WinfForm 控件之dev表格 GridControl
基本用法 1.新建一个winformAPP 放一个gridControl 为gridC 再放一个button 用法与dataGrid一样 代码如下: /// <summary> /// 显 ...
- Dev中GridControl的GridView 基本样式设置
基本样式图: 代码如下: /// <summary> /// gridView样式 /// </summary> /// <param name="gdv&qu ...
- Dev中gridControl修改列为按钮
(1)点击Run Designer (2)点击要修改的列,把列的ColumnEdit属性设置为RepositoryItemButtonEdit (3)把TextEditStyle属性设置为HideTe ...
随机推荐
- 【自己的下载平台】搭建aria2网站
前言 本文章将带你搭建一个自己的服务器下载平台:aria2,它的用途是什么? 下载用途 百度网盘 普通文件 迅雷种子 等等 准备工具 服务器连接软件xshell或者putty 一台服务器 安装宝塔面板 ...
- 理解 Java 内存模型的因果性约束
目录 理解 Java 内存模型的因果性约束 欢迎讨论 规范理解 例子练习 例子1 例子2 总结 理解 Java 内存模型的因果性约束 欢迎讨论 欢迎加入技术交流群186233599讨论交流,也欢迎关注 ...
- 5,Hadoop中的文件
1,文件结构 · bin:脚本和命令目录. · etc:配置文件目录. · sbin:命令目录,主要包含HDFS和YARN中各类服务的启动和关闭,依赖于bin中的脚本. · share:各个模块编译后 ...
- 压力测试(九)-Jmeter压测课程总结和架构浅析
安装常见问题 1.问题 [root@iZwz95j86y235aroi85ht0Z bin]# ./jmeter-server Created remote object: UnicastServer ...
- 这么香的Chrome插件,你都安装了吗?
工欲善其事必先利其器,今天长话短说,介绍13个敏捷.高效的Chrome插件 根据使用方式,本人将其划分为三大类: 开发者工具 日常效率工具类 浏览器管理类 开发者工具 1. Web Developer ...
- 一文快速入门Shell脚本_了解Sheel脚本基本命令
通过代码和注释的形式,列举了shell的基础操作,快速入门.shell在线编辑器 注释 单行用#号:多行::<<' 多行注释... '.:<<a 多行注释... a.:< ...
- 使用nestjs集成grpc具体操作
两个程序中, 提供grpc服务的称为服务端, 调用grpc服务的为客户端, 以下是grpc服务端和客户端的代码编写 1. 创建两个nestjs项目demo1(端口: 3000)和demo2(端 ...
- Python 【面向对象】
前言 Python从设计之初就已经是一门面向对象的语言,正因为如此,在Python中创建一个类和对象是很容易的.本章节我们将详细介绍Python的面向对象编程. 如果你以前没有接触过面向对象的编程语言 ...
- weex 和 appcan 的个人理解
appcan是浏览器技术,前端代码运行在webview上,而weex是原生引擎渲染,说白了就是把H5翻译成原生. weex的官网上说,在开发weex页面就像开发普通网页一样,在渲染weex页面时和原生 ...
- R语言实战(二) 创建数据集
2.1 数据集的概念 不同的行业对于数据集的行和列叫法不同.统计学家称它们为观测(observation)和变量(variable),数据库分析师则称其为记录(record)和字段(field),数据 ...