博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Winform开发框架之数据即时更新的实现
阅读量:5903 次
发布时间:2019-06-19

本文共 3908 字,大约阅读时间需要 13 分钟。

在我的随笔中,Winform开发介绍过很多内容,随着介绍的深入,很多地方进行精细化的介绍当中了。我们一般在Winform的列表界面中展现相关记录,在一个弹出窗口给客户录入数据,OK,这些没问题,但是我们录入数据后,很多情况下忽略了一些用户体验,等客户自己刷新才在列表中显示最新的记录出来,这样有些注重细节的客户就不愿意了。在我的一个项目开发中,有客户就有这样的抱怨,为什么我录入数据,还要手动刷新,为什么不能一保存就能同时更新列表?好,技术上肯定不是问题,思想考虑不够深入而已。下面我来介绍基于我的Winform开发框架的这种数据即时更新的实现过程。

1、Winform开发框架的界面层的继承关系

在开篇之前,首先介绍一下Winform开发框架中的界面层的继承关系,首先我把所有窗体区分为三类,一类是普通的窗体,一类编辑窗体,还有一类是列表显示窗体。窗体的集成可以封装处理很多东西,良好的封装和继承,可以为我们提高效率,减少重复代码,它的作用不再在此讨论和强调。

采用窗体继承,极大程度上统一了界面,并且对常用的界面操作,提供了良好的封装,如基础数据编辑、新增窗体积累封装了对回车、方向键、数据刷新、异常处理、数据检查、数据保存、数据更新等接口,为窗体的数据处理提供了很大的方便性。

而数据查询显示窗体则考虑到多文档展示的需要,一般继承合适的基类,封装一些常用到的界面布局,以便实现相应的界面处理效果。

上面所述的三类窗体,继承的界面基类分别是下面几个。普通的窗体继承自BaseForm,编辑窗体继承自BaseEditForm,列表显示窗体继承自BaseDock。在工程中如下所示。

在UML设计图中,我们看到他的关系如下所示,其中绿色边框的为我们上面的基类,红色边框的是我们实际的窗体对象,从这个图中,我们可以很清晰看到他的关联关系。

BaseEditForm相对来说,比其他两个基类窗体复杂一些,他除了提供几个数据保存必须的按钮外,还可以通过前后进行数据查看,他的初始化界面及应用例子界面如下所示。

2、Winform开发框架之数据即时更新的实现

介绍完上面的继承关系后,我们来看看基于这种继承模式,如何实现数据及时更新的操作,也就是在数据保存窗体,保存数据后,数据记录同步在列表中展现的效果。

1)首先在基类界面BaseEditForm中添加事件处理

public partial class BaseEditForm : BaseForm    {        public event EventHandler OnDataSaved;//子窗体数据保存的触发

2)然后添加事件的处理操作,如下所示。

///         /// 处理数据保存后的事件触发        ///         public virtual void ProcessDataSaved(object sender, EventArgs e)        {            if (OnDataSaved != null)            {                OnDataSaved(sender, e);            }        }

3)在数据保存的时候,触发即时更新数据的事件

///         /// 保存数据(新增和编辑的保存)        ///         public virtual bool SaveEntity()        {            bool result = false;            if(!string.IsNullOrEmpty(ID))            {                //编辑的保存                result = SaveUpdated();            }            else            {                //新增的保存                result = SaveAddNew();            }            return result;        }        ///         /// 更新已有的数据        ///         /// 
public virtual bool SaveUpdated() { return true; } /// /// 保存新增的数据 /// ///
public virtual bool SaveAddNew() { return true; } /// /// 保存 /// /// 关闭窗体 private void SaveEntity(bool close) { // 检查输入的有效性 if (this.CheckInput()) { // 设置鼠标繁忙状态 this.Cursor = Cursors.WaitCursor; try { if (this.SaveEntity()) { ProcessDataSaved(this.btnOK, new EventArgs()); MessageDxUtil.ShowTips("保存成功"); if (close) { this.DialogResult = DialogResult.OK; this.Close(); } else { this.ClearScreen(); } } } catch (Exception ex) { this.ProcessException(ex); } finally { // 设置鼠标默认状态 this.Cursor = Cursors.Default; } } }

以上属于基类的数据保存操作,我们特别注意这段代码即可

if (this.SaveEntity()) {     ProcessDataSaved(this.btnOK, new EventArgs());

4)列表展现界面的操作实现

实现上面的操作后,这些就不需要在BaseEditForm的子类做任何操作了,只需要在具体的列表展现界面类中实现下面的代码即可。

我们知道,列表界面一般都会有具体的数据刷新函数封装(如BindData函数),那么我们在新建数据的时候,实现代码是这样的。

///         /// 新增数据操作        ///         private void btnAddNew_Click(object sender, EventArgs e)        {            FrmEditLaw dlg = new FrmEditLaw();            dlg.OnDataSaved += new EventHandler(dlg_OnDataSaved);            dlg.ShowDialog();        }        void dlg_OnDataSaved(object sender, EventArgs e)        {            BindData();        }

这样我们在新窗体(数据添加、数据编辑)中维护数据的时候,一旦触发保存操作,这些最新的数据记录也在列表中展现出来了。

最后放上一个Winform开发框架的界面,供参考。

 

 

本文转自博客园伍华聪的博客,原文链接:,如需转载请自行联系原博主。

你可能感兴趣的文章
一次react滚动列表的实践---兼容ios安卓
查看>>
探索runC (下)
查看>>
浅析微信支付:开发前的准备
查看>>
我理解的数据结构(七)—— 堆和优先队列(Heap And PriorityQueue)
查看>>
Category 特性在 iOS 组件化中的应用与管控
查看>>
python模块之shutil
查看>>
浮动的label
查看>>
前端工程化
查看>>
微信公众号开发中的支付流程
查看>>
PowerShell 学习笔记 - 1 PS Core 基础
查看>>
NodeJS+Express搭建个人博客-环境搭建(一)
查看>>
关于iOS 11.x微信连wifi流程中,在Portal页无法拉起微信问题的简单记录
查看>>
Golang Gin实践 番外 请入门 Makefile
查看>>
php7 垃圾回收机制详解
查看>>
Ionic3/angular4 颜色选择器
查看>>
理解贝叶斯定理
查看>>
Linux流量复制工具
查看>>
Hadoop中的通用分布式计算框架
查看>>
时间戳转换成时间日期格式及去重
查看>>
聊聊spring cloud gateway的LoadBalancerClientFilter
查看>>