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

采用窗体继承,极大程度上统一了界面,并且对常用的界面操作,提供了良好的封装,如基础数据编辑、新增窗体积累封装了对回车、方向键、数据刷新、异常处理、数据检查、数据保存、数据更新等接口,为窗体的数据处理提供了很大的方便性。
而数据查询显示窗体则考虑到多文档展示的需要,一般继承合适的基类,封装一些常用到的界面布局,以便实现相应的界面处理效果。

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

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

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

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

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

代码如下 复制代码
public partial class BaseEditForm : BaseForm
{
public event EventHandler OnDataSaved;//子窗体数据保存的触发

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

代码如下 复制代码
/// <summary>
/// 处理数据保存后的事件触发
/// </summary>
public virtual void ProcessDataSaved(object sender, EventArgs e)
{
if (OnDataSaved != null)
{
OnDataSaved(sender, e);
}
}

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

代码如下 复制代码
/// <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;
}

(www.111cn.net) /// <summary>
/// 保存
/// </summary>
/// <param name="close">关闭窗体</param>
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函数),那么我们在新建数据的时候,实现代码是这样的。

代码如下 复制代码
/// <summary>
/// 新增数据操作
/// </summary>
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();
}

这样我们在新窗体(数据添加、数据编辑)中维护数据的时候,一旦触发保存操作,这些最新的数据记录也在列表中展现出来了。
from:http://www.111cn.net/net/171/43076.htm

asp.net中Winform开发框架之数据即时更新的实现的更多相关文章

  1. WINFROM中自定义控件之绑定数据即时更新

    相信在WINFROM中写自定义控件或者用户控件,很多人都多多少少用过点 最近发现一个用户控件,绑定的数据源没办法自动更新,其实以前处理过这类的问题,可是这次遇到又花了1个多小时,所以决定记下来 在用户 ...

  2. ASP.NET中设置一个定时器来定时更新 转

    asp.net 定时器 比较少用,  中国红木网这是一个相当实用的功能,有了RSS博客镜像,就不需要在多处同时发布博客日志了.比如你同时在新浪上有自己的博客,又同时有自己的个人博客站点,那么你只需要在 ...

  3. Winform开发框架之通用自动更新模块(转)

    在网络化的环境中,特别是基于互联网发布的Winform程序,程序的自动更新功能是比较重要的操作,这样可以避免挨个给使用者打电话.发信息通知或者发送软件等,要求其对应用程序进行升级.实现程序的自动更新, ...

  4. mysql 中实现多条数据同时更新

    有时间我们需要对一张表进行批量数据的更新.首先我们想的是update 语句. 比如对一张订单表order_info 多条数据更新, update order_inifo set   order_cod ...

  5. ASP.NET中实现页面间数据传递的方法

    说到页面间数据传递,很多人都会想到通过像Session这样的全局变量,但是向Session中添加的东西太多会增加服务器的压力,页面间数据传递,数据的作用范围越小越好.   ASP.NET页面间数据传递 ...

  6. asp.net中TreeView的大数据加载速度优化

    由于数据量太大,加载树时间很长,所以进行了优化 前台 .aspx <asp:Panel ID="Panel2" runat="server" Height ...

  7. 在asp.net中导出表格Excel数据

    第一步:需要引用org.in2bits.MyXls程序集到使用页面 第二步:前台代码 <asp:Button ID="LeadingOut" runat="serv ...

  8. ASP.NET中Dataset的table数据合并、数据截取、数据排序

    1.两个相同字段表的合并: public static DataSet CombineTables(DataSet _ds, DataTable _dt1, DataTable _dt2) { Dat ...

  9. ASP.NET 中HttpRuntime.Cache缓存数据

    最近在开始一个微信开发,发现微信的Access_Token获取每天次数是有限的,然后想到缓存,正好看到微信教程里面推荐HttpRuntime.Cache缓存就顺便看了下. 写了(Copy)了一个辅助类 ...

随机推荐

  1. 【树莓派】【转】树莓派3装Android 6.0,支持Wi-Fi和蓝牙

    树莓派3装Android 6.0,支持Wi-Fi和蓝牙 相信对于许多树莓派初学者(包括我)来说,Android系统的确是一个不错的选择.但国内这方面资源稀缺,经本人FQ苦寻,找到了老外的树莓派Andr ...

  2. 微信小程序 - ios不能播放背景音乐

    由以下原因导致的 1. 未设置标题(backgroundPlayer.title)或标题为空 2. url只能英文,不能出现空格以及其它字符(中文.韩文.日文等)- iOS要求英文路径

  3. 数据库中truncate与delete的区别与联系

    昨天被问到truncate与delete的区别,truncate没用过,回去百度了一下,才知道还有这个一种语句. truncate table命令将快速删除数据表中的所有记录(保留数据表结构).这种快 ...

  4. android JNI调用(Android Studio 3.0.1)(转)

    最近回头复习了一下android 的jni调用,却发现按以前的方法调用失败,一怒之下就重新摸索,碰了几次壁,发现网上好多教程都不能成功调用,于是记录一下现在AS版本成功好用的调用方法. 这里设定你的n ...

  5. Zuul Timeouts

    19.13 Zuul Timeouts 19.13.1 Service Discovery Configuration If Zuul is using service discovery there ...

  6. Spring Cloud开发实践 - 03 - 接口实现和下游调用

    接口实现 Scot Commons Impl 接口实现模块 scot-commons-impl, 一方面实现了 scot-commons-api 的接口, 一方面将自己暴露为 REST 服务. 有4个 ...

  7. Android控件进阶-自定义流式布局和热门标签控件

    技术:Android+java   概述 在日常的app使用中,我们会在android 的app中看见 热门标签等自动换行的流式布局,今天,我们就来看看如何 自定义一个类似热门标签那样的流式布局吧,类 ...

  8. win8下硬盘安装Ubuntu12.04双系统成功记录

    一开始是在windows下VirtualBox虚拟机中搞了一个Ubuntu玩,时间一长,感觉卡的厉害,浪费时间,那就装个双系统! 在win8下磁盘管理中的最后一个盘中压缩出20G左右的空闲硬盘分区: ...

  9. Swift 导航栏设置图片点击事件,图片蓝色的解决方案

    如果导航栏想做一个点击事件,正好是一个图片 我们可以直接这样: self.navigationItem.rightBarButtonItem = UIBarButtonItem(image: UIIm ...

  10. 使用maven命令安装jar包到本地仓库

    第三方jar包在开发工具中引入后编译没问题, 启动调试包括打包时会提示找不到jar包的错误.需要上传到maven仓库中,并在pom文件内引入. maven命令: 安装指定文件到本地仓库命令:mvn i ...