1.1:创建表结构

新建三张商品关联的表,表模型如下:

创建SQL语句略

1.2:生成表Model(生成方法见上一节)

1.3:生成tb_ProductType的单结构界面然后添加到项目中

1.4:修改GZVIP.Dictionary模块中DictionaryMain类,新增产品类型功能

  1. public class DictionaryMain : ModuleFunctionManage
  2. {
  3.  
  4. public DictionaryMain()
  5. {
  6. FunPools.AddFunction(typeof(frm_Level), "等级管理", "Level");
  7. FunPools.AddFunction(

typeof(frm_ProductType), "产品类型", "ProductType"

  1. );
  2. }
  3. }

Image添加如下三个图片如下

相应修改frm_ProductType界面

运行重新加载字典管理DLL结果如下:

至此:商品类型添加完毕

接下来生成商品管理

2.1生成tb_Product表的但结构界面并附加到项目

对界面做一些简单设置:

切换到后台代码修改Load代码(红色部分):

  1. private void frm_Product_Load(object sender, EventArgs e)
  2. {
  3. _SummaryView = gv_Summary;
  4. gv_Summary.OptionsView.ColumnAutoWidth = false;
  5. //_bll = new bllBusiness(typeof(tb_Product),"P",4);

_bll = new bllBusiness<tb_Product>("P", , typeof

  1. (tb_ProductPrice));
  2. //添加只读列
  3. base.AddControlsOnlyRead(txtCreateUser,txtCreateDate,txtLastUpdateUser,txtLastUpdateDate);
  4. //只有新增状态下才可用
  5. base.AddControlsOnAddKey();
  6.  
  7. this.BoundDatasource();
  8. }

修改DoBoundEditData方法

  1. //绑定明细编辑页的数据
  2. public override void DoBoundEditData()
  3. {
  4. //base.DoBoundEditData();

LibraryTools.DoBindingEditorPanel(layoutControl1, EditData.Tables[_bll.SummaryTableName], "txt"

  1. );
  2. gc_Detail.DataSource

=

  1. EditData.Tables[tb_ProductPrice._TableName];
  2. }

编辑数据编辑页增加按钮和删除按钮两个按钮的点击事件

  1. //明细表增加
  2. private void btn_DetailAdd_Click(object sender, EventArgs e)
  3. {
  4. //新增一条记录,并设置商品编号
  5. DataRow dr = EditData.Tables[tb_ProductPrice._TableName].Rows.Add();
  6. dr[tb_ProductPrice.ProductID] = txtProductID.EditValue;
  7. }
  8. //明细表删除
  9. private void btn_DetailDelete_Click(object sender, EventArgs e)
  10. {
  11. if (gv_Detail.FocusedRowHandle < ) return;
  12. if (Msg.AskQuestion("确定要删除选中的价格记录吗?") == false) return;
  13. gv_Detail.DeleteSelectedRows();
  14. }

修改DictionaryMain类

  1. public class DictionaryMain : ModuleFunctionManage
  2. {
  3. public DictionaryMain()
  4. {
  5. FunPools.AddFunction(typeof(frm_Level), "等级管理", "Level");
  6. FunPools.AddFunction(typeof(frm_ProductType), "商品类型", "ProductType");
  7. FunPools.AddFunction(

typeof(frm_Product), "商品管理", "Product"

  1. );
  2. }
  3. }

2.2添加产品类别绑定

修改GZVIP.BLL.DastaCache类,增加ProductType只读属性

  1. /// <summary>
  2. /// 产品类别
  3. /// </summary>
  4. public DataTable ProductType
  5. {
  6. get
  7. {
  8. DataTable dt = CommonData.FindFromCache(tb_ProductType._TableName);
  9. if (dt == null)
  10. {
  11. dt = bllDataCommon.GetAllDataTable(tb_ProductType._TableName, Loginer.CurrentLoginer.SystemDBName
  12. , tb_ProductType.ProductTypeID, tb_ProductType.ProductTypeName);
  13. AddToCache(dt.Copy());
  14. }
  15. return dt;
  16. }
  17. }

修改GZVIP.Library.BouindData类,增加BoundProductType()静态方法

  1. /// <summary>
  2. /// 绑定商品类别
  3. /// </summary>
  4. /// <param name="lue"></param>
  5. /// <param name="displayCombination"></param>
  6. /// <param name="ADDNULL"></param>
  7. public static void BoundProductType(LookUpEdit lue, bool displayCombination, bool ADDNULL)
  8. {
  9. lue.Properties.Columns.Clear();
  10. InitializeControl(lue, new string[] { "编号", "名称" }, new string[] { tb_ProductType.ProductTypeID, tb_ProductType.ProductTypeName });
  11. lue.Properties.Columns[].Width = ;
  12. lue.Properties.Columns[].Width = ;
  13. lue.Properties.PopupWidth = ;
  14.  
  15. DataTable dt = DataCache.Cache.ProductType.Copy();
  16. if (ADDNULL) dt = Common.ADDNULL(dt);
  17.  
  18. string displayMember = tb_ProductType.ProductTypeName;
  19. if (displayCombination)
  20. {
  21. Common.AddColumns(dt, tb_ProductType.ProductTypeID, tb_ProductType.ProductTypeName);
  22. displayMember = Common.DefNewColName;
  23. }
  24. DataBinder.BindingLookupEditDataSource(lue, dt, displayMember, tb_ProductType.ProductTypeID);
  25. }
  26.  
  27. /// <summary>
  28. /// 绑定商品类别
  29. /// </summary>
  30. /// <param name="lue"></param>
  31. /// <param name="displayCombination"></param>
  32. /// <param name="ADDNULL"></param>
  33. public static void BoundProductType(CheckedComboBoxEdit lue, bool displayCombination, bool ADDNULL)
  34. {
  35. DataTable dt = DataCache.Cache.ProductType.Copy();
  36. if (ADDNULL) dt = Common.ADDNULL(dt);
  37.  
  38. string displayMember = tb_ProductType.ProductTypeName;
  39. if (displayCombination)
  40. {
  41. Common.AddColumns(dt, tb_ProductType.ProductTypeID, tb_ProductType.ProductTypeName);
  42. displayMember = Common.DefNewColName;
  43. }
  44. DataBinder.BindingCheckedComboBoxSource(lue, dt, displayMember, tb_ProductType.ProductTypeID);
  45. }

在frm_Product的Load事件中添加数据源绑定

  1. private void frm_Product_Load(object sender, EventArgs e)
  2. {
  3. _SummaryView = gv_Summary;
  4. gv_Summary.OptionsView.ColumnAutoWidth = false;
  5. //_bll = new bllBusiness(typeof(tb_Product),"P",4);
  6. _bll = new bllBusiness<tb_Product>("P", , typeof(tb_ProductPrice));
  7. //添加只读列
  8. base.AddControlsOnlyRead(txtCreateUser,txtCreateDate,txtLastUpdateUser,txtLastUpdateDate);
  9. //只有新增状态下才可用
  10. base.AddControlsOnAddKey();
  11.  
  12. this.BoundDatasource();
  13. }
  14.  
  15. private void BoundDatasource()
  16. {
  17. DataBinderTools.Bound.BoundUserName(lue_UserName);
  18. DataBinderTools.Bound.BoundUserName(txtCreateUser);
  19. DataBinderTools.Bound.BoundUserName(txtLastUpdateUser);
  20.  
  21. DataBinderTools.Bound.BoundProductType(txt_ProductType, false, true);
  22. DataBinderTools.Bound.BoundProductType(txtProductTypeID, true, true);
  23. }

重写ValidateBeforSave方法,用于保存前验证

  1. //保存前数据验证
  2. protected override bool ValidateBeforSave()
  3. {
  4.  
  5. bool Validate = true &
  6. CommonTools.IsNotEmpBaseEdit(txtProductName, "产品名称不能为空!")
  7. & CommonTools.IsNotEmpBaseEdit(txtProductTypeID, "产品类别编号不能为空!")
  8. & CommonTools.IsNotEmpBaseEdit(txtProductPrice, "默认价格不能为空!");
  9. //if (Validate == false) return;
  10. if (Validate == true)
  11. EditData.Tables[tb_Product._TableName].Rows[][tb_Product.ProductTypeName] = (txtProductTypeID.GetSelectedDataRow() as DataRowView).Row[tb_ProductType.ProductTypeName];
  12. return Validate;
  13. }

重写SetControlAccessable方法,修改状态改变的时候

  1. /// <summary>
  2. /// 设置按钮可用状态,如果已经在ControlOnlyReads或SetControlAccessable中添加,这里不需要重新设置
  3. /// </summary>
  4. /// <param name="Edit"></param>
  5. protected override void SetControlAccessable(bool Edit)
  6. {
  7. //LibraryTools.SetControlAccessable(tp_Edit, Edit);
  8. base.SetControlAccessable(Edit);
  9. gv_Detail.OptionsBehavior.Editable = Edit;
  10.  
  11. }

完成以后运行重新加载模块,测试功能

添加商品到此完结

关于GZFramwork快速开发框架

作者:GarsonZhang  QQ:382237285

唯一QQ交流群:288706356

欢迎提出您的宝贵意见

GZFramwork快速开发框架演练之会员系统(四)添加商品管理的更多相关文章

  1. GZFramwork快速开发框架演练之会员系统(三)添加会员等级管理

    1.设计会员等级表结构 创建语句: from sysobjects where id = object_id('tb_MembersLevel') and type = 'U') drop table ...

  2. GZFramwork快速开发框架演练之会员系统(二)添加字典模块

    开始前请先阅读 GZFramwork快速开发框架之窗体设计说明 第一步:准备模块图片 图片为2张大小分别为16x16和32x32,放在\Debug\images目录下    因为会员管理模块并不多   ...

  3. GZFramwork快速开发框架演练之会员系统(一)框架源码下载

    GZFramwork框架开发环境为.NET 4.0 (必须)   VS2013+SQL2005+DevExpress v13.2.8+FastReport (推荐)  数据库建模工具PowerDesi ...

  4. GZFramwork快速开发框架之窗体设计说明

    1.  明细页数据源获取(基类已经处理) 重载GetEditData方法,此方法为自定义获得明细也的数据源,用于绑定明细页,此返回值会赋值给EditData //根据主键获得数据编辑页的数据 publ ...

  5. ASP.NET快速开发框架、这才是高大上档次后台管理UI界面

    另外献上在<线体验Demo地址>希望大家也能从中得到一些启发.地址:http://121.40.148.178:8080/ . 用户名:guest,密码:123456QQ技术交流群:239 ...

  6. ASP.NET通用权限系统快速开发框架

    系统在线演示地址: http://120.90.2.126:8051 登录账户:system,密码:system### DEMO下载地址: http://download.csdn.net/detai ...

  7. C# 嵌入dll 动软代码生成器基础使用 系统缓存全解析 .NET开发中的事务处理大比拼 C#之数据类型学习 【基于EF Core的Code First模式的DotNetCore快速开发框架】完成对DB First代码生成的支持 基于EF Core的Code First模式的DotNetCore快速开发框架 【懒人有道】在asp.net core中实现程序集注入

    C# 嵌入dll   在很多时候我们在生成C#exe文件时,如果在工程里调用了dll文件时,那么如果不加以处理的话在生成的exe文件运行时需要连同这个dll一起转移,相比于一个单独干净的exe,这种形 ...

  8. CRL快速开发框架系列教程四(删除数据)

    本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...

  9. 力软信息化系统快速开发框架 web端+winform端

    力软信息化系统快速开发框架是一套集权限管理+快速开发+动态接口+通用组件+动态UI于一体的全新.net信息化快速开发框架.力软信息化系统快速开发框架的使用,大大地缩短了开发周期,提高了软件质量,同时也 ...

随机推荐

  1. Python字符串,元组、列表、字典

    1.字符串 <string>.strip() 去掉两边空格及去指定字符 <string>.split() 按指定字符分隔字符串为数组 <string>.isdigi ...

  2. BizTalk开发系列(二十八) MSMQ 适配器

    MSMQ(MicroSoft Message Queue,微软消息队列)是在多个不同的应用之间实现相互通信的一种异步传输模式,相互通信的应用可以分布于同一台机器上,也可以分布于相连的网络空间 中的任一 ...

  3. Unity学习疑问记录之时间变量

    1.Time.deltaTime 以秒计算,完成最后一帧的时间 放在Update()函数中的代码是以帧来执行的.如果我们需要物体的移动以秒来执行.我们需要将物体移动的值乘以Time.deltaTime ...

  4. php SPL学习

    数据结构 SplDoublyLinkedList - 该SplDoublyLinkedList类提供了一个双向链表的主要功能 SplStack - 该SplStack类提供了一种使用双向链表实现栈的主 ...

  5. 转: KindEditor 图片空间文件增加删除文件、文件夹功能(ASP语言环境)

    KindEditor 图片上传功能中集成的图片空间文件管理插件可以对已上传图片进行管理,十分便捷,只是没有图片删除功能,仔细研读xieliang分享的经验后,自己动手改造了一下,顺便分享给有同样需求的 ...

  6. 【爬虫】python之BeautifulSoup用法

    1.爬虫 网络爬虫是捜索引擎抓取系统的重要组成部分.爬虫的主要目的是将互联网上的网页下载到本地形成一个或联网内容的镜像备份.通过分析和过滤HTML 代码,实现对图片.文字等资源的获取. 2.pytho ...

  7. EF CodeFirst 创建数据库

    最近悟出来一个道理,在这儿分享给大家:学历代表你的过去,能力代表你的现在,学习代表你的将来. 十年河东十年河西,莫欺少年穷 学无止境,精益求精    话说EF支持三种模式:Code First   M ...

  8. 用Unity开发HTC VIVE——移动漫游篇

    这篇文章主要写的是通过手柄控制移动在场景中漫游.在通过手柄控制移动时,我主要写了两个脚本一个ChildTransform.cs.Move.cs;1. ChildTransform这个脚本主要是为了获取 ...

  9. Leetcode: Sort Characters By Frequency

    Given a string, sort it in decreasing order based on the frequency of characters. Example 1: Input: ...

  10. String.format中大括号的加入方法

    因为相对于string Builder  自己更喜欢 string.format 的形式拼接字符串。 今天在写代码的时候怎么都报错,弄的我很奇怪 最后发现问题出在字符串中出现大括号“{”的问题,我想这 ...