使用观察者模式实时更新程序打开多个界面绑定组件的数据源

  使用观察者模式实时更新程序打开多个界面绑定组件的数据源


使用观察者模式(Observer Pattern),实时更新当前程序打开多个界面的绑定组件的数据源。

实例截图参考:

贴图图片-微信截图_20191018202236


贴图图片-微信截图_20191018202332


贴图图片-微信截图_20191018202440




观察者接口设计:

C# Code:

public interface IObserver
{
   string Name { get; }
   
   void Notify();
}


观察者实例1:

C# Code:

/// <summary>
/// 产品成本明细表的成本项目Lookup组件观察者
/// </summary>
public class ProductCostParamObserver : IObserver
{
   protected string _TableName = "";
   protected object _ObservedData;
   private RepositoryItemLookUpEdit _LookUpEdit;
   private bool _ReloadDataSource = false;//调用通知事件时是否重新加载数据源
   
   public ProductCostParamObserver(string tableName,
   RepositoryItemLookUpEdit lookupEdit, bool reloadDataSource = false)
   {
      _TableName = tableName;
      _LookUpEdit = lookupEdit;
      _ReloadDataSource = reloadDataSource;
      
      this.Notify();
   }
   
   public string Name { get { return _TableName; } }
   
   public virtual void Notify()
   {
      if (_ReloadDataSource)
      DataDictCache.Cache.RemoveCache(_TableName);
      
      //绑定组件的数据源
      DataBinderTools.BoundProductCostParam(_LookUpEdit);
   }
}

//来源:C/S框架网(www.csframework.com) QQ:23404761


观察者实例2:

C# Code:


/// <summary>
/// 产品类别下拉选择组件观察者
/// </summary>
public class ProductCategoryObserver : IObserver
{
   protected string _TableName = "";
   protected object _ObservedData;
   private TreeListLookUpEdit _LookUpEdit;
   private ImageList _ImageList;
   private bool _ReloadDataSource = false;//调用通知事件时是否重新加载数据源
   
   public ProductCategoryObserver(string tableName,
   TreeListLookUpEdit lookupEdit, ImageList imageList, bool reloadDataSource = false)
   {
      _ReloadDataSource = reloadDataSource;
      _TableName = tableName;
      _LookUpEdit = lookupEdit;
      _ImageList = imageList;
      
      this.Notify();
   }
   
   public string Name { get { return _TableName; } }
   
   public virtual void Notify()
   {
      if (_ReloadDataSource)
      DataDictCache.Cache.RemoveCache(_TableName);
      
      //绑定组件的数据源
      DataBinderTools.BoundProductCategory(_LookUpEdit, _ImageList);
   }
}

//来源:C/S框架网(www.csframework.com) QQ:23404761



观察者队列全局管理器:

应用场景界面,如《产品成本管理》界面,必须逐个添加观察者到全局管理器,当用户添加、删除或更新基础资料,实时通知相关观察者同步作业。


C# Code:

/// <summary>
/// 观察者队列全局管理器
/// </summary>
public class DataDictObservers
{
   private static List<IObserver> _Observers = new List<IObserver>();
   
   /// <summary>
   /// 增加观察者到队列
   /// </summary>
   /// <param name="observer">观察者</param>
   public static void Add(IObserver observer)
   {
      _Observers.Add(observer);
   }
   
   /// <summary>
   /// 通知观察者
   /// </summary>
   /// <param name="observerName">观察者名称</param>
   public static void Notify(string observerName)
   {
      foreach (IObserver o in _Observers)
      {
         if (o.Name == observerName) o.Notify();
      }
   }
}

//来源:C/S框架网(www.csframework.com) QQ:23404761



实时通知相关观察者同步作业:


C# Code:

/// <summary>
///提交数据成功后,即时进行其它数据操作。
/// </summary>
/// <param name="dataTable"></param>
protected virtual void DoAfterSave(DataTable dataTable)
{
   //同步更新缓存数据
   DataDictCache.Cache.SyncAddOrUpdateCache(dataTable.Rows[0], _UpdateType, _BLL.SummaryTableName, _BLL.KeyFieldName);
   
   //通知观察者列表
   DataDictObservers.Notify(dataTable.TableName);
}

//来源:C/S框架网(www.csframework.com) QQ:23404761


DoAfterSave源码,参考frmBaseDataDictionary.cs 代码。

通知观察者(DataDictObservers.Notify)有以下几种方式:

1. 保存数据字典后即时调用,用户体验较好。
2. 手工点击主窗体下面的任务栏【刷新缓存】按钮。



应用场景:如《产品成本管理》界面

C# Code:

//已注释:观察者模式替代
//DataBinderTools.BoundProductCategory(txt_Category, imageList1);
//DataBinderTools.BoundProductCategory(txtCategory, imageList1);
//DataBinderTools.BoundProductCostParam(repParam);

//采用观察者模式,实时更新当前程序打开多个界面的绑定组件的数据源
DataDictObservers.Add(new ProductCategoryObserver(dt_ProductCategory.__TableName, txtCategory, imageList1));
DataDictObservers.Add(new ProductCategoryObserver(dt_ProductCategory.__TableName, txt_Category, imageList1));
DataDictObservers.Add(new ProductCostParamObserver(dt_CostProductParams.__TableName, repParam));

//来源:C/S框架网(www.csframework.com) QQ:23404761





相关文章:

开发应用-观察者模式之C#实现缓存数据更新


版权声明:本文为开发框架文库发布内容,转载请附上原文出处连接
C/S框架网
发表评论

评论内容
昵称:
关联文章

使用观察模式实时更新程序打开界面组件数据
开发应用-观察模式之C#实现缓存数据更新
数据(ViewDataBinding)与数据校验(ValidateForSave)
C#使用DataBindings属性不同类型数据
DEV组件LookupEdit,ComboBoxEdit数据
手工某个下拉数据窗口(LookUpEdit)数据
C# 给数据文本框.Text属性赋值,但没有保存数据
GridView表格中LookupEdit单选组件
DEV CheckedListBoxControl组件数据
C#TreeListDataSource属性及获取DataRow数据
数据文本输入框TextEdit.Text或EditValue属性赋值,失去焦点文本自动清空了
使用DataBinderTools工具类定下拉LookupEdit组件数据
使用[后台数据更新模型]保存主从表数据(C#码)
[原创]Asp.NetGridView数据显示标题
C# DevExpress TreeListLookUpEdit 数据下拉窗体
编辑网站SSL证书提示:至少一个其他网站正在使用同一个https
CSFramework软件版本自动升级程序支持客户端系统共享使用一个升级程序
C/S开发框架教程:使用基础资料(数据字典)DAL层更新主从表(或表)数据
C#线程处理队列数据(交叉线程访问及Invoke方法使用)
SQL使用LIKE查询模糊匹配特殊标点符号数据