winform 窗体实现增删改查(CRUD)窗体基类模式
参考博客下方: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)窗体基类模式的更多相关文章
- winform 窗体实现增删改查(CRUD)共用模式
转载:http://www.csframework.com/archive/2/arc-2-20110617-1632.htm 高度封装的编辑窗体 http://www.cnblogs.com/wuh ...
- IDEA SpringBoot-Mybatis-plus 实现增删改查(CRUD)
上一篇: IDEA SpringBoot-Mybatis实现增删改查(CRUD) 下一篇:Intellij IDEA 高效使用教程 (插件,实用技巧) 最好用的idea插件大全 一.前言 Mybati ...
- 基于SSM之Mybatis接口实现增删改查(CRUD)功能
国庆已过,要安心的学习了. SSM框架以前做过基本的了解,相比于ssh它更为优秀. 现基于JAVA应用程序用Mybatis接口简单的实现CRUD功能: 基本结构: (PS:其实这个就是用的Mapper ...
- C#使用Xamarin开发可移植移动应用进阶篇(10.综合演练,来一份增删改查CRUD)
前言 系列目录 C#使用Xamarin开发可移植移动应用目录 源码地址:https://github.com/l2999019/DemoApp 可以Star一下,随意 - - 说点什么.. 呃 也有半 ...
- java中增删改查(CRUD)总结
对于User表增删改查:1:save(保存方法) view(查询所有记录) update(更新方法) delete(删除方法) 通过method这个参数进行判断执行不同的操作 2: 具体的实现: ...
- idea+spring4+springmvc+mybatis+maven实现简单增删改查CRUD
在学习spring4+springmvc+mybatis的ssm框架,idea整合简单实现增删改查功能,在这里记录一下. 原文在这里:https://my.oschina.net/finchxu/bl ...
- ssm 框架实现增删改查CRUD操作(Spring + SpringMVC + Mybatis 实现增删改查)
ssm 框架实现增删改查 SpringBoot 项目整合 一.项目准备 1.1 ssm 框架环境搭建 1.2 项目结构图如下 1.3 数据表结构图如下 1.4 运行结果 二.项目实现 1. Emplo ...
- Winform 学生管理系统增删改查
数据库: create database adonet go use adonet go create table xue ( code ), name ), sex bit, birth datet ...
- JDBC工具类 访问数据库 增删改查CRUD的通用方法
1 package com.zmh.util; 2 3 import java.sql.*; 4 import java.util.ArrayList; 5 import java.util.Hash ...
随机推荐
- 在liberty中通过LTPA设置单点登录
不要忘了下面的设置,参考: https://www-01.ibm.com/support/knowledgecenter/was_beta_liberty/com.ibm.websphere.wlp. ...
- BZOJ 2063: 我爸是李刚
2063: 我爸是李刚 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 155 Solved: 82[Submit][Status][Discuss] ...
- 【Python实例二】BeautifulSoup爬虫简单实践
前言 前面安装了BeautifulSoup库,现在就来实现一下吧. 目录 一.Urllib库的使用 二.BeautifulSoup的使用 三. 一个示例 ----------------------- ...
- hdu 1399 Starship Hakodate-maru (暴力搜索)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1399 题目大意:找到满足i*i*i+j*(j+1)*(j+2)/6形式且小于等于n的最大值. #inc ...
- 用Golang自己构造ICMP数据包
ICMP是用来对网络状况进行反馈的协议,可以用来侦测网络状态或检测网路错误. 限于当前Golang在网络编程方面的代码稀缺,资料甚少,所以分享一个用Golang来构造ICMP数据包并发送ping程序的 ...
- require.js模块化管理和加载js(按需加载)简单实例教学
一.为什么要用require.js? 最早的时候,所有Javascript代码都写在一个文件里面,只要加载这一个文件就够了.后来,代码越来越多,一个文件不够了,必须分成多个文件,依次加载.下面的网页代 ...
- SSH Secure Shell 无法登录:server responded "algorithm negotiation failed”
SSH Secure Shell Client 连接 ubuntu系统报错 修改ssh的配置文件 /etc/ssh/sshd_config在配置文件中添加: Ciphers aes128-cbc,ae ...
- seleniumu 3.0复选框操作(定位一组元素)
一般验证复选框是否可以选择点击常用到定位一组元素去循环遍历执行点击事件.但是有时候在不同的浏览器下可能会存在差异化的最终结果. 目前谷歌浏览器常常存在多次点击同一复选框,导致最终最后两项复选框均未被勾 ...
- pytest学习(3)
在pytest 2.0以上的版本里,我们也可以通过python -m pytest ...来调用.这实际上和pytest ...几乎一摸一样. 只是用python的时候,把当面目录也加入到sys.pa ...
- xshell连接虚拟机CentOS出现eth0 device not found的解决方法
昨天用xshell连接虚拟机上的centOS老是连接不上,ifconfig eth0 命令显示 device not found.不知道是什么原因... 折腾了好久 网上是各种搜啊 终于找到解决方法了 ...