Database2Sharp是一款代码生成工具和数据库文档生成工具,该工具一直伴随着我及我的粉丝们经历过各种各样的项目开发,在实际开发中能带来效率的提高及编程的快乐。不过自上个6.0版本以来,我一直忙于各种项目及研究中,很少继续把新的思想整合进去,最近在做我的Winform开发框架的整理工作,觉得应该改进这段时间来发现的问题,并融入已经逐渐完善的Winform开发框架基础上来,于是经过几天的努力,把该代码生成工具的一些缺陷修复并增加了Winform界面代码生成的功能(以前一直只是生成底层及Web界面层),并重新命名版本号为7.0。以后再继续完善后,在此大版本上再继续升级吧。 

本次主要的修改如下:

1)修改设置不重新加载数据库信息。

以前版本,为了保证对数据库基础信息的及时更新,只要对一些关键的参数设置,通常都要重新刷新数据库基础信息(如表、列等基础信息),这样生成的代码就会保证使用最新的设置信息。如上图中的过滤表前缀的参数,是为了把表名称转换为友好名称的类名而定义的,他是在数据库加载的时候,自动把表别名信息生成的。

这个问题使用上一直感觉不太好,7.0版本修复了这个问题,把相关的信息保存的同时,在内存中对数据库表、字段等基础对象进行了更新,确保使用最新配置而无需重新加载整个数据库信息。

2)Winform界面代码可配置生成

说起Winform界面的代码生成,一般来说就两种界面比较典型,一个是查询列表显示界面,一个是数据查看编辑界面。本功能也主要是提供这两类界面代码的生成,通过配置查询列表中的条件字段以及查询列表字段显示信息,就可以合理生成符合我的WInform框架要求的界面代码,查询列表显示界面类继承自BaseDock基础类。另一方面,通过配置数据查看编辑界面的编辑字段,数据检查字段,判断关键数据重复的字段等参数,可以生成较为完善的数据查看编辑界面代码,生成界面如下所示。

以上参数只要执行生成代码一次,即会自动保存起来,下次打开相同表的时候,会把之前的配置信息还原,方便用户的多次操作。由于界面在不同的界面控件(如DevExpress、传统界面等)处理上有所不同,因此生成的界面代码也会根据用户的设置信息进行选择性生成。另外界面代码是我的Winform框架体系里面一部分,所以整合了我的分页控件、基础窗体类的继承等特点,如果你看不懂,可以多看看我的Winform框架文章或者分页控件文章介绍。

Winform界面代码生成后,会直接在代码编辑窗体中打开,用户可以复制或者保存起来放到VS的编辑器中进行相应的修改,后续的工作应该较为轻松了。

下面我们来分别看看生成的代码效果如何吧。

1)查询列表界面类

View Code

using System;
using System.Text;
using System.Data;
using System.Drawing;
using System.Windows.Forms;
using System.ComponentModel;
using System.Collections.Generic;

using WHC.Pager.Entity;
using WHC.OrderWater.Commons;
using WHC.Dictionary;

using WHC.TestProject.BLL;
using WHC.TestProject.Entity;

namespace WHC.TestProject.UI
{
    public partial class FrmItemDetail : BaseDock
    {
        public FrmItemDetail()
        {
            InitializeComponent();

InitDictItem();

this.winGridViewPager1.OnPageChanged += new EventHandler(winGridViewPager1_OnPageChanged);
            this.winGridViewPager1.OnStartExport += new EventHandler(winGridViewPager1_OnStartExport);
            this.winGridViewPager1.OnEditSelected += new EventHandler(winGridViewPager1_OnEditSelected);
            this.winGridViewPager1.OnAddNew += new EventHandler(winGridViewPager1_OnAddNew);
            this.winGridViewPager1.OnDeleteSelected += new EventHandler(winGridViewPager1_OnDeleteSelected);
            this.winGridViewPager1.OnRefresh += new EventHandler(winGridViewPager1_OnRefresh);
            this.winGridViewPager1.AppendedMenu = this.contextMenuStrip1;
            this.winGridViewPager1.ShowLineNumber = true;
            this.winGridViewPager1.dataGridView1.DataBindingComplete += new DataGridViewBindingCompleteEventHandler(dataGridView1_DataBindingComplete);
        }
        
        /// <summary>
        /// 绑定数据后,分配各列的宽度
        /// </summary>
        void dataGridView1_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
        {
            if (this.winGridViewPager1.dataGridView1.Columns.Count > 0)
            {
                this.winGridViewPager1.dataGridView1.Columns["ID"].Width = 100;
                this.winGridViewPager1.dataGridView1.Columns["ItemNo"].Width = 100;
                this.winGridViewPager1.dataGridView1.Columns["ItemName"].Width = 100;
                this.winGridViewPager1.dataGridView1.Columns["Manufacture"].Width = 100;
                this.winGridViewPager1.dataGridView1.Columns["MapNo"].Width = 100;
                this.winGridViewPager1.dataGridView1.Columns["Specification"].Width = 100;
                this.winGridViewPager1.dataGridView1.Columns["Material"].Width = 100;
                this.winGridViewPager1.dataGridView1.Columns["ItemBigType"].Width = 100;
                this.winGridViewPager1.dataGridView1.Columns["ItemType"].Width = 100;
                this.winGridViewPager1.dataGridView1.Columns["Unit"].Width = 100;
                this.winGridViewPager1.dataGridView1.Columns["Price"].Width = 100;
                this.winGridViewPager1.dataGridView1.Columns["Source"].Width = 100;
                this.winGridViewPager1.dataGridView1.Columns["StoragePos"].Width = 100;
                this.winGridViewPager1.dataGridView1.Columns["UsagePos"].Width = 100;
                this.winGridViewPager1.dataGridView1.Columns["Note"].Width = 100;
                this.winGridViewPager1.dataGridView1.Columns["WareHouse"].Width = 100;
                this.winGridViewPager1.dataGridView1.Columns["Dept"].Width = 100;
            }
        }

/// <summary>
        /// 编写初始化窗体的实现,可以用于刷新
        /// </summary>
        public override void  FormOnLoad()
        {   
            BindData();
        }
        
        /// <summary>
        /// 初始化字典列表内容
        /// </summary>
        private void InitDictItem()
        {
            //初始化代码
        }
        
        /// <summary>
        /// 分页控件刷新操作
        /// </summary>
        private void winGridViewPager1_OnRefresh(object sender, EventArgs e)
        {
            BindData();
        }
        
        /// <summary>
        /// 分页控件删除操作
        /// </summary>
        private void winGridViewPager1_OnDeleteSelected(object sender, EventArgs e)
        {
            if (MessageUtil.ShowYesNoAndTips("您确定删除选定的记录么?") == DialogResult.No)
            {
                return;
            }

DataGridView grid = this.winGridViewPager1.dataGridView1;
            if (grid != null)
            {
                foreach (DataGridViewRow row in grid.SelectedRows)
                {
                    BLLFactory<ItemDetail>.Instance.Delete(row.Cells["ID"].Value.ToString());
                }
            }
            
            BindData();
        }
        
        /// <summary>
        /// 分页控件编辑项操作
        /// </summary>
        private void winGridViewPager1_OnEditSelected(object sender, EventArgs e)
        {
            DataGridView grid = this.winGridViewPager1.dataGridView1;
            if(grid.SelectedRows.Count == 0) return;

string ID = grid.SelectedRows[0].Cells["ID"].Value.ToString();
            List<string> IDList = new List<string>();
            if (grid != null)
            {
                foreach (DataGridViewRow row in grid.Rows)
                {
                    IDList.Add(row.Cells["ID"].Value.ToString());
                }
            }

if (!string.IsNullOrEmpty(ID))
            {
                FrmEditItemDetail dlg = new FrmEditItemDetail();
                dlg.ID = ID;
                dlg.IDList = IDList;
                if (DialogResult.OK == dlg.ShowDialog())
                {
                    BindData();
                }
            }
        }
        
        /// <summary>
        /// 分页控件新增操作
        /// </summary>        
        private void winGridViewPager1_OnAddNew(object sender, EventArgs e)
        {
            btnAddNew_Click(null, null);
        }
        
        /// <summary>
        /// 分页控件全部导出操作前的操作
        /// </summary> 
        private void winGridViewPager1_OnStartExport(object sender, EventArgs e)
        {
            string where = GetConditionSql();
            this.winGridViewPager1.AllToExport = BLLFactory<ItemDetail>.Instance.FindToDataTable(where);
        }

/// <summary>
        /// 分页控件翻页的操作
        /// </summary> 
        private void winGridViewPager1_OnPageChanged(object sender, EventArgs e)
        {
            BindData();
        }
        
        /// <summary>
        /// 根据查询条件构造查询语句
        /// </summary> 
        private string GetConditionSql()
        {
            SearchCondition condition = new SearchCondition();
            condition.AddCondition("ItemNo", this.txtItemNo.Text, SqlOperator.Like);
            condition.AddCondition("ItemName", this.txtItemName.Text, SqlOperator.Like);
            condition.AddCondition("Manufacture", this.txtManufacture.Text, SqlOperator.Like);
            condition.AddCondition("MapNo", this.txtMapNo.Text, SqlOperator.Like);
            condition.AddCondition("Specification", this.txtSpecification.Text, SqlOperator.Like);
            condition.AddCondition("Material", this.txtMaterial.Text, SqlOperator.Like);
            condition.AddCondition("ItemBigType", this.txtItemBigType.Text, SqlOperator.Like);
            condition.AddCondition("ItemType", this.txtItemType.Text, SqlOperator.Like);
            
            string where = condition.BuildConditionSql(DatabaseType.SqlServer).Replace("Where", "");

return where;
        }
        
        /// <summary>
        /// 绑定列表数据
        /// </summary>
        private void BindData()
        {
            this.winGridViewPager1.DisplayColumns = "ID,ItemNo,ItemName,Manufacture,MapNo,Specification,Material,ItemBigType,ItemType,Unit,Price,Source,StoragePos,UsagePos,Note,WareHouse,Dept";
            #region 添加别名解析

this.winGridViewPager1.AddColumnAlias("ID", "ID");
            this.winGridViewPager1.AddColumnAlias("ItemNo", "备件编号");
            this.winGridViewPager1.AddColumnAlias("ItemName", "备件名称");
            this.winGridViewPager1.AddColumnAlias("Manufacture", "供货商");
            this.winGridViewPager1.AddColumnAlias("MapNo", "图号");
            this.winGridViewPager1.AddColumnAlias("Specification", "规格型号");
            this.winGridViewPager1.AddColumnAlias("Material", "材质");
            this.winGridViewPager1.AddColumnAlias("ItemBigType", "备件属类");
            this.winGridViewPager1.AddColumnAlias("ItemType", "备件类别");
            this.winGridViewPager1.AddColumnAlias("Unit", "单位");
            this.winGridViewPager1.AddColumnAlias("Price", "单价");
            this.winGridViewPager1.AddColumnAlias("Source", "来源");
            this.winGridViewPager1.AddColumnAlias("StoragePos", "库位");
            this.winGridViewPager1.AddColumnAlias("UsagePos", "使用位置");
            this.winGridViewPager1.AddColumnAlias("Note", "备注");
            this.winGridViewPager1.AddColumnAlias("WareHouse", "所属库房");
            this.winGridViewPager1.AddColumnAlias("Dept", "所属部门");

#endregion

string where = GetConditionSql();
            List<ItemDetailInfo> list = BLLFactory<ItemDetail>.Instance.Find(where, this.winGridViewPager1.PagerInfo);
            this.winGridViewPager1.DataSource = new WHC.Pager.WinControl.SortableBindingList<ItemDetailInfo>(list);
            this.winGridViewPager1.PrintTitle = Portal.gc.gAppUnit + " -- " + "信息报表";
        }
        
        /// <summary>
        /// 查询数据操作
        /// </summary>
        private void btnSearch_Click(object sender, EventArgs e)
        {
            BindData();
        }
        
        /// <summary>
        /// 新增数据操作
        /// </summary>
        private void btnAddNew_Click(object sender, EventArgs e)
        {
            FrmEditItemDetail dlg = new FrmEditItemDetail();
            if (DialogResult.OK == dlg.ShowDialog())
            {
                BindData();
            }
        }
        
        /// <summary>
        /// 提供给控件回车执行查询的操作
        /// </summary>
        private void SearchControl_KeyUp(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
            {
                btnSearch_Click(null, null);
            }
        }
    }
}

DevExpress界面效果图

2)数据编辑界面类

View Code

using System;
using System.Text;
using System.Data;
using System.Drawing;
using System.Windows.Forms;
using System.ComponentModel;
using System.Collections.Generic;

using WHC.Dictionary;
using WHC.OrderWater.Commons;

using WHC.TestProject.BLL;
using WHC.TestProject.Entity;

namespace WHC.TestProject.UI
{
    public partial class FrmEditItemDetail : BaseEditForm
    {
        public FrmEditItemDetail()
        {
            InitializeComponent();
        }
                
        /// <summary>
        /// 实现控件输入检查的函数
        /// </summary>
        /// <returns></returns>
        public override bool CheckInput()
        {
            bool result = true;//默认是可以通过

#region MyRegion
            
            if (this.txtItemNo.Text.Trim().Length == 0)
            {
                 MessageUtil.ShowTips("请输入备件编号");
                this.txtItemNo.Focus();
                result = false;
            }
             else if (this.txtItemName.Text.Trim().Length == 0)
            {
                 MessageUtil.ShowTips("请输入备件名称");
                this.txtItemName.Focus();
                result = false;
            }
             else if (this.txtManufacture.Text.Trim().Length == 0)
            {
                 MessageUtil.ShowTips("请输入供货商");
                this.txtManufacture.Focus();
                result = false;
            }
            #endregion

return result;
        }

/// <summary>
        /// 初始化数据字典
        /// </summary>
        private void InitDictItem()
        {
            //初始化代码
        }

/// <summary>
        /// 数据显示的函数
        /// </summary>
        public override void DisplayData()
        {
            InitDictItem();//数据字典加载(公用)

if (!string.IsNullOrEmpty(ID))
            {
                #region 显示客户信息
                ItemDetailInfo info = BLLFactory<ItemDetail>.Instance.FindByID(ID);
                if (info != null)
                {
                    txtItemNo.Text = info.ItemNo;
                    txtItemName.Text = info.ItemName;
                    txtManufacture.Text = info.Manufacture;
                    txtMapNo.Text = info.MapNo;
                    txtSpecification.Text = info.Specification;
                    txtMaterial.Text = info.Material;
                    txtItemBigType.Text = info.ItemBigType;
                    txtItemType.Text = info.ItemType;
                    txtUnit.Text = info.Unit;
                    txtPrice.Text = info.Price;
                    txtSource.Text = info.Source;
                    txtStoragePos.Text = info.StoragePos;
                    txtUsagePos.Text = info.UsagePos;
                    txtNote.Text = info.Note;
                    txtWareHouse.Text = info.WareHouse;
                    txtDept.Text = info.Dept;
                } 
                #endregion
                //this.btnOK.Enabled = Portal.gc.HasFunction("ItemDetail/Edit");             
            }
            else
            {
                //this.btnOK.Enabled = Portal.gc.HasFunction("ItemDetail/Add");  
            }
        }

/// <summary>
        /// 编辑或者保存状态下取值函数
        /// </summary>
        /// <param name="info"></param>
        private void SetInfo(ItemDetailInfo info)
        {
            info.ItemNo = txtItemNo.Text;
            info.ItemName = txtItemName.Text;
            info.Manufacture = txtManufacture.Text;
            info.MapNo = txtMapNo.Text;
            info.Specification = txtSpecification.Text;
            info.Material = txtMaterial.Text;
            info.ItemBigType = txtItemBigType.Text;
            info.ItemType = txtItemType.Text;
            info.Unit = txtUnit.Text;
            info.Price = txtPrice.Text;
            info.Source = txtSource.Text;
            info.StoragePos = txtStoragePos.Text;
            info.UsagePos = txtUsagePos.Text;
            info.Note = txtNote.Text;
            info.WareHouse = txtWareHouse.Text;
            info.Dept = txtDept.Text;
        }
         
        /// <summary>
        /// 新增状态下的数据保存
        /// </summary>
        /// <returns></returns>
        public override bool SaveAddNew()
        {
            ItemDetailInfo info = new ItemDetailInfo();
            SetInfo(info);

try
            {
                #region 新增数据
                //检查是否还有其他相同关键字的记录
                bool exist = BLLFactory<ItemDetail>.Instance.IsExistKey("ItemNo", info.ItemNo);
                if (exist)
                {
                     MessageUtil.ShowTips("指定的【备件编号】已经存在,不能重复添加,请修改");
                    return false;
                }
                bool succeed = BLLFactory<ItemDetail>.Instance.Insert(info);
                if (succeed)
                {
                    //可添加其他关联操作

return true;
                }
                #endregion
            }
            catch (Exception ex)
            {
                LogHelper.Error(ex);
                 MessageUtil.ShowError(ex.Message);
            }
            return false;
        }

/// <summary>
        /// 编辑状态下的数据保存
        /// </summary>
        /// <returns></returns>
        public override bool SaveUpdated()
        {
            //检查不同ID是否还有其他相同关键字的记录
            bool exist = BLLFactory<ItemDetail>.Instance.CheckExist(this.txtItemNo.Text, ID);
            if (exist)
            {
                 MessageUtil.ShowTips("指定的【备件编号】已经存在,不能重复添加,请修改");
                return false;
            }
            ItemDetailInfo info = BLLFactory<ItemDetail>.Instance.FindByID(ID);
            if (info != null)
            {
                SetInfo(info);

try
                {
                    #region 更新数据
                    bool succeed = BLLFactory<ItemDetail>.Instance.Update(info, info.ID.ToString());
                    if (succeed)
                    {
                        //可添加其他关联操作
                       
                        return true;
                    }
                    #endregion
                }
                catch (Exception ex)
                {
                    LogHelper.Error(ex);
                     MessageUtil.ShowError(ex.Message);
                }
            }
           return false;
        }
    }
}

DevExpress界面效果图

Database2Sharp代码生成工具已经上传到服务器,需要该代码生成工具的,请到下载地址(http://www.iqidi.com/download/Database2SharpSetup.rar )下载。

Database2Sharp重要更新之生成Winform框架界面代码相关推荐

  1. 代码生成工具更新--快速生成Winform框架的界面项目

    在之前版本的代码生成工具Database2Sharp中,由于代码生成都是考虑Winform和Web通用的目的,因此Winform界面或者Web界面都是单独生成的,在工具中生成相应的界面后,复制到项目里 ...

  2. onvif学习笔记4:Windows环境使用gsoap生成onvif框架代码

    因工作原因,被安排接手onvif,为了对其有个真正.切实.系统.认真.严谨的了解,就利用周末等业余时间来学习研究. 本文主要讲述在windows环境中使用gsoap生成onvif框架的代码,但不涉及框 ...

  3. ONVIF协议网络摄像机(IPC)客户端程序开发使用gSOAP生成ONVIF框架代码(C++)03-->Windows

    其它的不多说,直接开始步骤. 我的版本是2.8.109,目前最新版本. 实际上,onvif的源码是兼容Linux.Windows版本的,例如如果你已经在这篇文章ONVIF协议网络摄像机(IPC)客户端 ...

  4. Database2Sharp之混合型Winform框架代码生成

    本人一直致力于Winform开发框架的研究和使用,有时候项目要求是传统Winform的,直接访问数据库进行获取数据:有的时候项目要求WCF框架,以分布式访问WCF服务获取数据的,虽然在Winform和 ...

  5. Database2Sharp重要更新之完善EnterpriseLibrary架构代码

    该软件很早就开始支持Enterprise Library的数据访问操作了,不过之前的没有生成一个完整的解决方案工程,只是生成了数据访问类和实体类,改善后的Enterprise Library代码生成, ...

  6. 基于插件架构的简单的Winform框架(下)

    前言 最近事情较多,终于有时间来写完这篇.在上一篇的基础上,本篇文章我们开始着手搭建一个简单的基于插件架构的Winform框架.(其实也就是一个小例子,也是对之前写过的代码的总结) 设计思路 写这个W ...

  7. C#小项目飞翔的小鸟游戏详细教程(Flying bird),基于Winform框架

    C#小项目飞翔的小鸟游戏详细教程(Flying bird),基于Winform框架 实现效果: 1.空格,鼠标左键控制小鸟跳 2.管道随机大小 3.小鸟与管道碰撞,小鸟碰到地面 4.小鸟煽动翅膀动画 ...

  8. Winform框架中内容的学习

    一.Winform框架中的内容 WinForm(一) WinForm入门与基本控件使用_阿阿阿安的博客-CSDN博客_winform winform 控件及其各个属性_weixin_30907935的 ...

  9. 基于C# winform框架开发的校园社团管理系统

    基于C# winform框架开发的校园社团管理系统 一.项目介绍 环环公益系统(HuanHuan System)是本人在校期间给自己所在社团开发的一款社团管理系统,拥有社团活动创建.活动报名.活动考勤 ...

最新文章

  1. apu和atom处理器两者的定位
  2. git push代码到远程新分支
  3. 你离理想中的数据中心,只差这五步
  4. RK3288 添加USB转虚拟串口设备
  5. 电平转换电路(三极管共射极)
  6. 2014_shanghai_visit
  7. linq 分组求和的一般方法
  8. 使用ViewPager制作Android引导界面
  9. 某科学的分支语句 --- switch
  10. Maxtocode 2.0 试用版发布
  11. 数据库主键和外键的关系
  12. 个人PHP博客开源代码下载推荐!免费
  13. 计算机科学基础慕课答案,大学计算机基础mooc习题整理(含答案)
  14. android dlna 小米电视盒子,小米电视DLNA投屏到电视步骤详解
  15. zabbix部署及监控测试
  16. OA系统如何实现实时项目成本核算
  17. 三元简化模型,助你加速团队成长
  18. HDU4355-三分
  19. python小练习--GUI基础
  20. #即时通讯#实现消息已读回执功能的思路与实现

热门文章

  1. php 语法验证_在线PHP语法检查器/验证器
  2. 跨区域报考计算机考试可以吗,考生注意!2020年医师资格机考跨题型不可以回看(附上机操作系统)...
  3. 微博python爬虫,每日百万级数据
  4. Python ln_虚拟机中单机Spark (Python版)安装
  5. resnet预训练模型_干货 | NLP中的十个预训练模型
  6. centos进程php-fpm,CentOS 6.x 开启Nginx和Php-fpm状态统计
  7. matlab逻辑电路图,基于.matlab的数字逻辑电路仿真.doc
  8. 事务屏幕创建tcode_数据库并发事务存在的问题(脏读、不可重复读、幻读等)...
  9. spring boot 配置网关时404错误_Kong中使用grpcweb插件代理grpc服务时遇到的坑
  10. 和孩子们一起学Python编程