基于Dev12.1的企业级Winform快速开发框架源码,支持复杂表单生成与ERP/MES系统定制
基于Dev控件(12.1版本)的企业Winform快速开发框架源码(C#代码Vs2010(12)SQLServer2019); 可快速生成各种表单(基础表单、主子甚至主多子及主子子表单、查询功能表单)功能不能满足 可写存储过程和扩展方法完成 解决您的后顾之忧 可以定制开发各类ERP、MES、上位机单片机程序等蹲格子间蹲车间ERP上位机写Winform快吐的朋友有没有尤其是老工业或者制造业客户甩过来“给我加个带三个子表的订单快速录入还要兼容旧系统比如他们车间的SQL Server 2008现在改2019了Dev12.1的Winform老控件哦不对Dev12.1原生是不是只支持到SQL2012哦框架里悄悄适配了ADO.NET Core或者System.Data.SqlClient的新版本不对VS2010是.NET 4.0对吧System.Data.SqlClient的4.8.x有兼容.NET 4.0的这个可以提一笔适配技巧悄悄解决兼容性的小bug先不管那个兼容性先不戳适配的问题先提Dev12.1的GridControl自动适配.NET 哦基础表单的生成器哦举个基础物料主界面生成器的简化版比如不是GUI拖拽是框架里有个JSON或者干脆XML的配置虽然XML老但和Dev12 VS2010 SQL旧系统搭不对直接放个框架里的基类继承调用比如// 随便建个新的【车间工位管理】基础表单就写这么点public partial class FrmWorkStation : FrmBaseMaster{// 哦对基类FrmBaseMaster直接把Dev的XtraForm、GridControl主表、查询栏LayoutControl、增删改查按钮BarManager全堆好了// 这里只需要重写几个虚方法给点数据源表名、主键、查询字段、表单名称public FrmWorkStation(){InitializeComponent();// 这一句base.SetBaseInfo(tbl_WorkStation, WSID, 车间工位信息管理);// 查询字段就加个布局base.AddQueryField(工位编号, WSCode, QueryType.StringLike);base.AddQueryField(工位名称, WSName, QueryType.StringLike);// 要不要绑定到对应的XtraGrid的GridView主表列哦对框架基类自动从SQL的表结构自动生成Dev的Grid列还带中文注释直接读sys.extended_properties对吧// 比如tblWorkStation的列只要在SQL Server里加个MSDescriptionDev的列标题就自动出来了不用手动改}}哦这个代码简单爽用户看了就懂不是吹牛皮。然后再插主子子的比如举个简化的生产工单工单主表下面XtraTabControl两个Tab第一个工序明细子1第二个每个工序的设备明细子子1第二个Tab是GridControl嵌套或者基类已经做好了主子子的基类比如FrmBaseMasterDetailDetail然后重写SetMasterDetailInfo对简化一点不要太全举个调用的片段// 生产工单主界面主表工单表public partial class FrmProdOrder : FrmBaseMasterDetailDetail{public FrmProdOrder(){InitializeComponent();// 基础信息还是那句base.SetBaseInfo(tbl_ProdOrder, POID, 生产工单管理);// 主表查询加查询字段base.AddQueryField(工单编号, POCode, QueryType.StringEquals);// 然后关联第一个Tab工序明细子表base.AddDetailTab(工序明细, tbl_ProdOrderProcess, POPID, POID, false); // 最后那个false要不要自动分页// 第二个Tab设备明细子子表base.AddSubDetailTab(工序设备明细, tbl_ProdOrderProcessEquip, POPEID, POPID, false);// 哦对设备明细的设备下拉选框架基类自动把SQL的主外键自动生成LookUpEdit了LookUpEdit的数据源自动关联tblEquip也是读设备表的MSDescription当列标题}}这个太爽了对吧然后接下来讲那个功能不满足的地方怎么办题目说写存储和扩展。比如举个存储过程的例子比如复杂的生产工单状态更新不是简单的Update要扣库存、更新工序流转卡更新这些框架基类留了个虚方法UpdateMasterBefore或者直接重写SaveMasterSaveDetailBefore或者给个SQL Server的简化版的调用存储过程的C#片段比如重写SaveMasterSaveDetailBefore的时候不更简单的基础查询要复杂的分组统计比如重写LoadMasterDataSource比如// 假设生产工单查询要按产品型号、月份分组并且带出工单状态数量统计不是直接查主表重写LoadMasterDataSourceprotected override DataTable LoadMasterDataSource(Dictionary queryParams){// 调用框架封装好的SqlHelperDev12自带还是框架集成的那个DevExpress.XtraEditors.XtraMessageBox不用自己写SqlHelper怕写错怕连接字符串自动读App.config对吧// 直接传个自己写的存储过程 sp_QueryProdOrderGroupstring spName sp_QueryProdOrderGroup;// queryParams直接转成SqlParameter框架的基类有个方法ToSqlParameters对吧var parameters queryParams.ToSqlParameters();// 然后调用基类封装好的ExecuteDataTablereturn base.ExecuteDataTable(spName, CommandType.StoredProcedure, parameters);基于Dev控件(12.1版本)的企业Winform快速开发框架源码(C#代码Vs2010(12)SQLServer2019); 可快速生成各种表单(基础表单、主子甚至主多子及主子子表单、查询功能表单)功能不能满足 可写存储过程和扩展方法完成 解决您的后顾之忧 可以定制开发各类ERP、MES、上位机单片机程序等}然后简单说一下扩展方法比如Dev的XtraGrid的列要加个“双击打开工序流转卡图片的功能不是框架基类没做的写个XtraGridControl的扩展方法// 随便加个静态类比如DevGridExtendspublic static class DevGridExtends{public static void BindDoubleClickOpenProcessCard(this GridControl grid, string picPathField){// 获取当前的主GridViewvar view grid.MainView as GridView;if (view null) return;// 绑定双击事件view.DoubleClick (s, e) {// 获取当前选中的行var row view.GetFocusedDataRow();if (row null) return;// 读取picPathField对应的图片路径string path row[picPathField].ToString();// 随便写个打开方法或者Dev有个XtraPdfViewer哦Dev12.1有XtraPdfViewer吧对直接new一个XtraForm放XtraPdfViewer加载path就行// 哦这里简化用Dev的XtraMessageBox.Show($打开图片/流转卡{path});};}}然后回到刚才的工序明细的子表重写LoadDetailAfterLoad完数据之后调用扩展方法// 在FrmProdOrder里重写LoadDetailAfter因为工序明细的子表假设第一个Tab的DetailView对吧protected override void LoadDetailAfter(string detailKey, DataTable dt){base.LoadDetailAfter(detailKey, dt);if (detailKey 工序明细){// 获取DetailGridViewvar detailView gridMain.ViewCollection[0] as GridView;// 绑定扩展方法detailView?.BindDoubleClickOpenProcessCard(ProcessCardPicPath);}}哦这个太顺了对吧然后接下来提一下兼容性的小技巧刚才想到的VS2010 .NET 4.0用Dev12.1 SQL Server 2019对吧因为Dev12.1自带的DevExpress.Data.ORM或者ADO.NET驱动原生可能不直接认SQL Server 2019的身份验证方式对吧比如SQL Server 2019默认是Azure那种不对App.config的连接字符串加个TrustServerCertificateTrue对.NET 4.0的System.Data.SqlClient 4.0.3对吧不对VS2010的System.Data.SqlClient默认版本哦NuGet.NET 4.0的NuGet可以手动装System.Data.SqlClient的4.1.1或者4.0.3对吧对的然后连接字符串改成connectionStringData Source你的SQL2019服务器;Initial Catalog你的数据库;User IDsa;Password你的密码;TrustServerCertificateTrue;providerNameSystem.Data.SqlClient /这个解决了很多连接错误比如A network-related or instance-specific error occurred establishing a connection to SQL Server那种然后接下来提一下框架里的其他小东西比如权限哦不用太细比如有简单的用户管理、角色管理、菜单权限管理是有的对吧Dev的BarManager的按钮自动根据权限隐藏对基类自动做了然后接下来收尾比如定制开发的事对吧题目说可以定制各类ERP、MES、上位机单片机程序哦可以提一句如果觉得Dev12这套不够或者需要上位机Modbus、OPC UADev有OPC Client控件但如果没有Dev12.1的OPC UA可能需要OPC DA或者自己封装哦可以提定制或者直接加个PLC通信模块对吧然后不要写太硬广但题目说解决后顾之忧比如有售后有源码注释哦对源码全的注释清晰每一行不是太细但重点基类的虚方法都有注释对吧然后结尾要轻松一点比如别再蹲一个星期写增删改查了对吧赶项目赶进度就试试这个框架对吧neverused51bce0c785ca2f68081bfa7d91973934蹲格子间蹲车间现场对接Winform项目的朋友有没有共鸣过吗尤其是老工业/制造业客户甩过来的需求永远是「加个3子表的生产订单快速录入、还要兼容他们之前改2019但必须用Dev12.1控件库、最好和老的SQL2008升级来的2019的MSDescription直接读哦对老客户的表结构早就标了当年为了省写Dev列标题累不累蹲格子间一周磨一个主子子表还要调Dev的XtraTabControl、主外键LookUpEdit、权限按钮BarManager全对齐的对齐藏bug的藏bug今天掏个宝贝给你们一套Dev12.1 VS2010(兼容.NET4.0 悄悄适配System.Data.SqlClient4.1.1兼容SQL2019的企业Winform快速开发全开源哦不题目给的是源码全源码先别听吹直接上核心的物料主界面生成就写这点// 新建个Form继承FrmBaseMaster——这个基类把Dev的XtraForm、主表GridControl、LayoutControl查询栏、增删改查打印导出权限按钮BarManager全焊在板子上了 public partial class FrmWorkStation : FrmBaseMaster { public FrmWorkStation() { InitializeComponent(); // 一句给基础身份表名、主键、窗口标题 base.SetBaseInfo(tbl_WorkStation, WSID, 车间工位信息管理); // 再加两个自己要的查询字段——StringLike就是模糊查询Equals是精确DateTimeBetween是范围框架都封装死常用的 base.AddQueryField(工位编号, WSCode, QueryType.StringLike); base.AddQueryField(工位名称, WSName, QueryType.StringLike); // 哦对Grid主表列自动读SQL表结构sys.extended_properties里的中文注释自动生成LookUpEdit外键不用再手动拖列、改LookUpEdit的列标题、关联数据源 } }编译完直接F5看界面对爽不爽工位编号模糊查工位表数据直接出来LookUpEdit比如工位类别关联的tblWSType自动读MSDescription外键WSID不会写错再来进阶的主多子主子子表单客户要的3子表生产订单对吧订单主表→第一个Tab工序明细子1→第二个Tab工序再关联的工具明细子子1→第三个Tab订单的质检计划子2没关系继承FrmBaseMasterDetailDetail——或者基类还有更灵活的FrmBaseMultiMasterDetail举个生产订单的主多子简化调用片段// 继承生产订单常用的FrmBaseMaster主 FrmBaseMasterDetail工序工具子子1 再加个独立Tab质检计划 public partial class FrmProdOrder : FrmBaseMasterDetailDetail { public FrmProdOrder() { InitializeComponent(); // 还是那句基础身份 base.SetBaseInfo(tbl_ProdOrder, POID, 生产工单管理); // 主表精确查POCode base.AddQueryField(工单编号, POCode, QueryType.StringEquals); // 关联第一个Tab工序明细子1主外键POID分页不关车间可能数据多 base.AddDetailTab(工序明细, tbl_ProdOrderProcess, POPID, POID, false); // 第一个Tab的工序明细再关联子子1工具明细主外键POPID base.AddSubDetailTab(工具明细, tbl_ProdOrderProcessTool, POPTDID, POPID, false); // 再加第三个独立Tab质检计划子2 base.AddDetailTab(质检计划, tbl_ProdOrderQC, POQCID, POID, false); // LookUpEdit比如工序关联的tbl_Process、工具关联的tbl_Tool全是自动的 } }哦对第三个Tab质检计划自动生成对吧分页的话最后那个参数改成true自动加Dev的XtraTabPageGridControl接下来是功能不满足怎么办别慌留了两条活路存储过程扩展方法第一条复杂业务写存储框架直接调比如生产订单审核不是简单的Update要扣库存、打工序流转卡的二维码生成、设备状态改成“生产中”框架基类留了一堆虚方法比如审核前虚方法CheckAuditBefore或者更简单的主表查询不是直接查要按产品型号、月份分组带出状态统计重写LoadMasterDataSource就行// 在FrmProdOrder里重写主表加载虚方法 protected override DataTable LoadMasterDataSource(Dictionarystring, object queryParams) { // 框架焊死的DbHelper读App.config的DefaultConnection字符串不用自己写怕死锁怕连接字符串错 // 传自己写的复杂存储 sp_QueryProdOrderGroup return base.ExecuteDataTable(sp_QueryProdOrderGroup, CommandType.StoredProcedure, queryParams.ToSqlParameters()); }第二条Dev小功能没加写扩展比如工序明细的子表列要加个“双击打开工序流转卡PDF”自己写个静态扩展方法随便给XtraGridControl绑定// 新建个Dev12通用的静态类 DevGridUtils public static class DevGridUtils { public static void BindDoubleClickOpenPdf(this GridControl grid, string pdfPathField) { var view grid.MainView as GridView; if (view null) return; // 绑定双击事件 view.DoubleClick (s, e) { var row view.GetFocusedDataRow(); if (row null) return; string path row[pdfPathField].ToString(); // Dev12.1自带XtraPdfViewer吧对直接new个弹窗就行 var pdfForm new XtraForm(); var pdfViewer new XtraPdfViewer { Dock DockStyle.Fill }; pdfViewer.LoadDocument(path); pdfForm.Controls.Add(pdfViewer); pdfForm.Text 工序流转卡; pdfForm.ShowDialog(); }; } }然后在生产订单的LoadDetailAfter子表加载完后虚方法调用就行protected override void LoadDetailAfter(string detailKey, DataTable dt) { base.LoadDetailAfter(detailKey, dt); if (detailKey 工序明细) { // 获取工序明细的GridView var detailView gridMain.ViewCollection[0] as GridView; // 绑定扩展方法路径字段是ProcessCardPdfPath detailView?.BindDoubleClickOpenPdf(ProcessCardPdfPath); } }哦对了还有VS2010 .NET4.0 Dev12.1 SQL2019的兼容性小技巧Dev12.1自带的驱动默认不直接认SQL2019的连接方式对吧比如会报A network-related or instance-specific error没关系在VS2010里手动装NuGet包管理器如果老版本VS2010自带的NuGet太老没关系下最新兼容的NuGet Package Manager for VS2010 SP1安装就行装System.Data.SqlClient 4.1.1这个版本兼容.NET4.0App.config的连接字符串加个TrustServerCertificateTrue改成这样connectionStrings add nameDefaultConnection connectionStringData Source你的SQL2019服务器;Initial Catalog你的数据库;User IDsa;Password你的密码;TrustServerCertificateTrue; providerNameSystem.Data.SqlClient / /connectionStrings搞定再也不用找连接错误找一天其他的小东西就不细说了比如简单的用户管理、角色管理、菜单权限管理Dev的BarManager按钮自动根据权限隐藏/禁用比如单据号自动生成器比如PO-202X-0001自动补零比如打印模板自定义用Dev的XtraReport Designer集成进去比如导出Excel/PDF/WordDev自带的基类焊死的导出按钮这套源码全的每一行重点基类的虚方法都有注释赶项目赶进度解决你的后顾之忧如果觉得Dev12这套不够或者需要定制各类ERP、MES、上位机Modbus RTU/TCP、OPC DA/UA、PLC通信模块比如西门子S7-200SMART/S7-1200/S7-1500、欧姆龙CP系列这些、单片机程序STM32、ESP32这些也可以找我别再蹲一个星期磨增删改查了赶紧试试这个框架