参考博客下方:http://www.cnblogs.com/wuhuacong/archive/2010/05/31/1748579.html

对于一般常用到的编辑数据、新增数据窗体,分开了两个不同的窗体进行处理,而且由于BaseForm窗体没有对通用的函数进行进一步的抽象,因此,编辑及新增窗体多了很多重复累赘的代码,其实可以把新增、编辑合并一个窗体,然后根据新增、编辑两种不同的条件进行处理即可。

由于BaseForm一般需要在大多数的窗体中,而新增编辑数据窗体一般较为特殊一点,可以再增加一个基类BaseEditForm,用来做新增编辑窗体的基类,该基类继承自BaseForm类,工程代码如下所示。

其中运行例子的效果如下所示:

编辑以及新增我们整合在一个窗体中,先看看该基类的设计视图,我们在其中添加了3个按钮(常用的添加、保存、关闭按钮)。

窗体的代码我大类采用了可重载的虚函数,留给子类窗体进行实现不同的处理操作,如窗体加载显示操作、显示数据到控件的操作、保存、新增等函数都是需要实现的,而调用逻辑以及一些通用的处理,则在基类BaseEditForm中实现,子类不用重复这些代码,按钮控件(添加、保存、关闭)的事件处理也已经进行了逻辑封装,如下所示。

代码


        public override void FormOnLoad()
        {
            base.FormOnLoad();
            if (!this.DesignMode)
            {
                if (!string.IsNullOrEmpty(ID))
                {
                    this.Text = "编辑 " + this.Text;
                    this.btnAdd.Visible = false;//如果是编辑,则屏蔽添加按钮
                }
                else
                {
                    this.Text = "新建 " + this.Text;
                }
                
                DisplayData();
            }
        }        /// <summary>
        /// 显示数据到控件上
        /// </summary>
        public virtual void DisplayData()
        {
        } 
        
        /// <summary>
        /// 检查输入的有效性
        /// </summary>
        /// <returns>有效</returns>
        public virtual bool CheckInput()
        {
            return true;
        }
               
        /// <summary>
        /// 清除屏幕
        /// </summary>
        public virtual void ClearScreen()
        {
            this.ID = "";////需要设置为空,表示新增
            ClearControlValue(this);
            this.FormOnLoad();
        }
       
        /// <summary>
        /// 保存数据(新增和编辑的保存)
        /// </summary>
        public virtual bool SaveEntity()
        {
            bool result = false;
            if(!string.IsNullOrEmpty(ID))
            {
                //编辑的保存
                result = SaveUpdated();
            }
            else
            {
                //新增的保存
                result = SaveAddNew();
            }             return result;
        }         /// <summary>
        /// 更新已有的数据
        /// </summary>
        /// <returns></returns>
        public virtual bool SaveUpdated()
        {
            return true;
        }         /// <summary>
        /// 保存新增的数据
        /// </summary>
        /// <returns></returns>
        public virtual bool SaveAddNew()
        {
            return true;
        }         /// <summary>
        /// 保存
        /// </summary>
        /// <param name="close">关闭窗体</param>
        private void SaveEntity(bool close)
        {
            // 检查输入的有效性
            if (this.CheckInput())
            {
                // 设置鼠标繁忙状态
                this.Cursor = Cursors.WaitCursor;
                try
                {
                    if (this.SaveEntity())
                    {
                        MessageUtil.ShowTips("保存成功");
                        if (close)
                        {
                            this.DialogResult = DialogResult.OK;
                            this.Close();
                        }
                        else
                        {
                            this.ClearScreen();
                        }                           
                    }
                }
                catch (Exception ex)
                {
                    this.ProcessException(ex);
                }
                finally
                {
                    // 设置鼠标默认状态
                    this.Cursor = Cursors.Default;
                }
            }
        }         private void btnAdd_Click(object sender, EventArgs e)
        {
            this.SaveEntity(false);
        }         private void btnOK_Click(object sender, EventArgs e)
        {
            this.SaveEntity(true);
        }         private void btnCancel_Click(object sender, EventArgs e)
        {
            this.DialogResult = DialogResult.Cancel;
            this.Close();
        }
 

其中值得介绍的是,窗体的控件数据清空在基类窗体中通过遍历实现了通用的数据清空操作,该部分代码引用了“潇湘隐者的博客(http://www.cnblogs.com/kerrycode/archive/2010/02/05/1664267.html),对此感谢。

另外,基类窗体还实现了Tab键的转换,这个思路来源于即日嘎拉的代码,但由于是基类实现,有些不同,他的放在每个具体的子类中,因此通用性有些限制。

我们重载了ProcessCmdKey(ref Message msg, Keys keyData) 函数后,就可以实现统一的回车键转换了。


代码
        protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
        {       
            if (keyData == Keys.F5)
            {
                this.FormOnLoad();
            }             if ((!(ActiveControl is Button)) &&
                (keyData == Keys.Up || keyData == Keys.Down || keyData == Keys.Enter))
            {
                if (keyData == Keys.Enter)
                {
                    System.Windows.Forms.SendKeys.Send("{TAB}");
                    return true;
                }
                if (keyData == Keys.Down)
                {
                    System.Windows.Forms.SendKeys.Send("{TAB}");
                }
                else
                {
                    SendKeys.Send("+{Tab}");
                }                 return true;
            }
            else
            {
                return base.ProcessCmdKey(ref msg, keyData);
            }
        }

最后,我们看看具体的子类窗体,看新增编辑界面需要实现的代码,如下所示,其中大部分是原子级别的操作,逻辑操作已经在基类中实现了哦:

代码


    public partial class FrmEditCustomer : BaseUI.BaseEditForm
    {
        public FrmEditCustomer()
        {
            InitializeComponent();
        }         /// <summary>
        /// 实现控件输入检查的函数
        /// </summary>
        /// <returns></returns>
        public override bool CheckInput()
        {
            bool result = true;             #region 输入验证
            if (this.txtName.Text.Length == 0)
            {
                MessageUtil.ShowTips("宾客名称不能为空");
                this.txtName.Focus();
                result = false;
            }
            else if (this.txtIDNumber.Text.Length == 0)
            {
                MessageUtil.ShowTips("证件号码不能为空");
                this.txtIDNumber.Focus();
                result = false;
            }             #endregion             return result;
        }         /// <summary>
        /// 编辑或者保存状态下取值函数
        /// </summary>
        /// <param name="info"></param>
        private void SetInfo(CustomerInfo info)
        {
            info.Address = txtAddress.Text;
            info.CompanyName = txtCompany.Text;
            info.IDCarType = cmbIDCarType.Text;
            info.Name = txtName.Text;
            info.Note = txtNote.Text;
            info.IDNumber = txtIDNumber.Text;
            info.Telephone = txtTelephone.Text;
            info.Source = cmbSource.Text;
            info.CustomerType = cmbType.Text;
            info.Sex = cmbSex.Text;
        }         /// <summary>
        /// 数据字典加载
        /// </summary>
        private void InitDictItem()
        {
            this.cmbSource.Items.Clear();
            this.cmbSource.Items.AddRange(DictItemUtil.GetCustomerSource());             this.cmbType.Items.Clear();
            this.cmbType.Items.AddRange(DictItemUtil.GetCustomerType());             this.cmbIDCarType.Items.Clear();
            this.cmbIDCarType.Items.AddRange(DictItemUtil.GetIDCarType());
        }         /// <summary>
        /// 数据显示的函数
        /// </summary>
        public override void DisplayData()
        {
            //数据字典加载(公用)
            InitDictItem();             if (!string.IsNullOrEmpty(ID))
            {
                //编辑状态下的数据显示
                CustomerInfo info = BLLFactory<Customer>.Instance.FindByID(ID);
                if (info != null)
                {
                    #region 显示客户信息
                    txtAddress.Text = info.Address;
                    txtCompany.Text = info.CompanyName;
                    txtName.Text = info.Name;
                    txtNote.Text = info.Note;
                    txtIDNumber.Text = info.IDNumber;
                    txtTelephone.Text = info.Telephone;
                    cmbSource.Text = info.Source;
                    cmbType.Text = info.CustomerType;
                    cmbSex.Text = info.Sex;
                    cmbIDCarType.Text = info.IDCarType;
                    lblCreateDate.Text = info.RegistrationDate.ToString();                     #endregion
                }
            }
            else
            {
                //新增状态的数据显示
                lblCreateDate.Text = DateTime.Now.ToString();
            }
        }         /// <summary>
        /// 新增状态下的数据保存
        /// </summary>
        /// <returns></returns>
        public override bool SaveAddNew()
        {
            CustomerInfo info = new CustomerInfo();
            SetInfo(info);
            info.RegistrationDate = DateTime.Now;
            bool succeed = BLLFactory<Customer>.Instance.Insert(info);
            return succeed;
        }         /// <summary>
        /// 编辑状态下的数据保存
        /// </summary>
        /// <returns></returns>
        public override bool SaveUpdated()
        {
            CustomerInfo info = BLLFactory<Customer>.Instance.FindByID(ID);
            if (info != null)
            {
                SetInfo(info);
                bool succeed = BLLFactory<Customer>.Instance.Update(info, info.ID.ToString());
                return succeed;
            }
            return false;
        }
    }

winform 窗体实现增删改查(CRUD)窗体基类模式的更多相关文章

  1. winform 窗体实现增删改查(CRUD)共用模式

    转载:http://www.csframework.com/archive/2/arc-2-20110617-1632.htm 高度封装的编辑窗体 http://www.cnblogs.com/wuh ...

  2. IDEA SpringBoot-Mybatis-plus 实现增删改查(CRUD)

    上一篇: IDEA SpringBoot-Mybatis实现增删改查(CRUD) 下一篇:Intellij IDEA 高效使用教程 (插件,实用技巧) 最好用的idea插件大全 一.前言 Mybati ...

  3. 基于SSM之Mybatis接口实现增删改查(CRUD)功能

    国庆已过,要安心的学习了. SSM框架以前做过基本的了解,相比于ssh它更为优秀. 现基于JAVA应用程序用Mybatis接口简单的实现CRUD功能: 基本结构: (PS:其实这个就是用的Mapper ...

  4. C#使用Xamarin开发可移植移动应用进阶篇(10.综合演练,来一份增删改查CRUD)

    前言 系列目录 C#使用Xamarin开发可移植移动应用目录 源码地址:https://github.com/l2999019/DemoApp 可以Star一下,随意 - - 说点什么.. 呃 也有半 ...

  5. java中增删改查(CRUD)总结

    对于User表增删改查:1:save(保存方法)  view(查询所有记录) update(更新方法) delete(删除方法) 通过method这个参数进行判断执行不同的操作 2: 具体的实现:   ...

  6. idea+spring4+springmvc+mybatis+maven实现简单增删改查CRUD

    在学习spring4+springmvc+mybatis的ssm框架,idea整合简单实现增删改查功能,在这里记录一下. 原文在这里:https://my.oschina.net/finchxu/bl ...

  7. ssm 框架实现增删改查CRUD操作(Spring + SpringMVC + Mybatis 实现增删改查)

    ssm 框架实现增删改查 SpringBoot 项目整合 一.项目准备 1.1 ssm 框架环境搭建 1.2 项目结构图如下 1.3 数据表结构图如下 1.4 运行结果 二.项目实现 1. Emplo ...

  8. Winform 学生管理系统增删改查

    数据库: create database adonet go use adonet go create table xue ( code ), name ), sex bit, birth datet ...

  9. JDBC工具类 访问数据库 增删改查CRUD的通用方法

    1 package com.zmh.util; 2 3 import java.sql.*; 4 import java.util.ArrayList; 5 import java.util.Hash ...

随机推荐

  1. Hibernate 三种状态变化 与 sql 语句的关系

    前言:在Hibernate中有三种状态,对它的深入理解,才能更好的理解hibernate的运行机理,刚开始不太注意这些概念,后来发现它是重要的.对于理解hibernate,JVM和sql的关系有更好的 ...

  2. 将数据导入hive,再将hive表导入hbase

    将数据到入hive的无分区表,再将无分区表导入hive的有分区表: --备份 create table tds_package_secinfobk as select * from tds_packa ...

  3. bzoj 1016 深搜

    首先我们知道MST的一些性质,对于这道题来说就是,假设我们先求出一颗MST设为G,由已知边权相同的边最多会有10条,那么假设我们在这10条边中选取size条边∈G,那么我们在这边权相同的边集E中任意选 ...

  4. 智联招聘的python岗位数据结巴分词(一)

    如何获取数据点击这里 下载之后的文件名为:all_results.csv 数据样式大概这样.然后下面我分析的是工作要求  也就是那边的绿框那一列. import csv import os impor ...

  5. 如何生成pyc/pyo/pyd文件

    # 一.如何生成pyc/pyo文件 # 1.通过编写代码生成 import py_compile # 参数如下 ''' def compile(file, cfile=None, dfile=None ...

  6. RBTree 红黑树

    红黑树 一.红黑树概述 红黑树不仅是一个二叉搜索树,并且满足以下规则: 1>每个节点不是红的就是黑的, 2>根结点为黑色, 3>如果节点为红色,其子节点必须为黑色, 4>任一节 ...

  7. selenium 警告框处理 (弹窗处理)

    在web应用中常常会遇见很多用JavaScript编写的alert .confirm 以及prompt 弹窗,这是就需要driver.switchTo().alert()来选取(定位)警告弹窗.再对弹 ...

  8. java连接Fastdfs图片服务器上传失败的解决方法

    照着视频上做,但是却连接不了虚拟机linux上的图片服务器,估计是linux防火墙的问题(这个实在是神烦,前面有好几次连接不了都是因为linux防火墙),果不其然,关闭即可. Linux关闭防火墙的命 ...

  9. 使用Mybatis做批量插入

    最近有个需求,将excel的数据导入的数据库的这个一个操作. 工作主要分为:解析excel,将excel中的数据单条循环插入数据库. 使用框架:mybatis+spring 使用过Mybatis的人都 ...

  10. 【互动问答分享】第7期决胜云计算大数据时代Spark亚太研究院公益大讲堂

    “决胜云计算大数据时代” Spark亚太研究院100期公益大讲堂 [第7期互动问答分享] Q1:Spark中的RDD到底是什么? RDD是Spark的核心抽象,可以把RDD看做“分布式函数编程语言”. ...