Observer设计模式:监视者模式。在类中的方法中处理的结果或者消息通过事件委托 的方式发送给主窗体。

因为在其它类中直接访问主窗体类,显示内容是不能直接调用控件赋值的,当然也有别的类似查阅控件名,直接赋值的方式,

这种方式似乎不是被提倡的。而观察者模式是常用的方式。

初学者在刚开始写程序时,往往把很多的方法函数都写在了主窗体类下,很方便的调用主窗体里边的控件,给予赋值,

但代码多了肯定会乱。所以要进阶必须熟悉当前讲的方式。

下边是个简洁的带参数的事件委托的写的代码

using System;
using System.Collections.Generic;
using System.Text;namespace Delegate {// 热水器public class Heater {private int temperature;public delegate void BoilHandler(int param);   //声明委托public event BoilHandler BoilEvent;        //声明事件// 烧水public void BoilWater() {for (int i = 0; i <= 100; i++) {temperature = i;if (temperature > 95) {if (BoilEvent != null) { //如果有对象注册BoilEvent(temperature);  //调用所有注册对象的方法
                  }}}}}// 警报器public class Alarm {public void MakeAlert(int param) {Console.WriteLine("Alarm:嘀嘀嘀,水已经 {0} 度了:", param);}}// 显示器public class Display {public static void ShowMsg(int param) { //静态方法Console.WriteLine("Display:水快烧开了,当前温度:{0}度。", param);}}class Program {static void Main() {Heater heater = new Heater();Alarm alarm = new Alarm();heater.BoilEvent += alarm.MakeAlert;    //注册方法heater.BoilEvent += (new Alarm()).MakeAlert;   //给匿名对象注册方法heater.BoilEvent += Display.ShowMsg;       //注册静态方法
heater.BoilWater();   //烧水,会自动调用注册过对象的方法
       }}
}
输出为:
Alarm:嘀嘀嘀,水已经 96 度了:
Alarm:嘀嘀嘀,水已经 96 度了:
Display:水快烧开了,当前温度:96度。
// 省略...

今天我犯了个比较郁闷现在想想很搞笑的错误

当然我的程序跟这个不同之处,

我在其它类中写好了事件委托,运行到     ResultEvent(resulteventargs); 启动委托事件时候提示未实例化对象。

后来对比了上边的 列子才发现自己的程序没问题,是自己定义了两个对象,第一个定义的对象没有引用事件,第二个定义了对象引用了事件,而程序里边找不到这个这个对象。很明显啊,类的程序是第一个对象启动起来的,当然相应的时候会找第一个对象。而不是第二个。

第一个对象th

ThreadHelp th = new ThreadHelp(path, add);

th.Start(); 启动程序,没有任何事件注册订阅。运行到  Start()里边   ResultEvent(resulteventargs);代码时找不到应该

具有的  th.ResultEvent += ShowMessage;  所以提示 未实例化。

为什么会出现这种情况,由于上边的代码是先写好的,事件是后加的,后加上事件后,我在Form1_Load 注册订阅的事件委托。

private void Form1_Load(object sender, EventArgs e)
{
ThreadHelp threadhelp = new ThreadHelp();
 EventHelper eventhelper = new EventHelper();

threadhelp.ResultEvent += ShowMessage;
}

结果就是出现了找不到实例化的原因。

修改代码:在第一个实力化对象中加入th.ResultEvent += ShowMessage; 问题解决

ThreadHelp th = new ThreadHelp(path, add);
th.ResultEvent += ShowMessage;
th.Start();

总结:刚出错时查了觉得示例化了啊,怎么还报错,刚开始也能意识到驴唇不对马嘴,由于对于事件有段时间没用的模糊,对比写的方式。导致花费了些时间。

第二,未找到对象里边的子对象也会被报错未被实力化,就像这次找不到承接这次事件的订阅者的报错。

附贴一个,主窗体下访问控件的简洁写法

if (txbtxt.InvokeRequired)
{
txbtxt.BeginInvoke(new MethodInvoker(delegate { txbtxt.Text = e.Messjsonstr; }));

}
else
{
txbtxt.Text = e.Messjsonstr;
}

转载于:https://www.cnblogs.com/zuochanzi/p/6090212.html

Observer设计模式中-委托事件-应用在消息在窗体上显示相关推荐

  1. winform中的状态栏,以及在状态栏目上显示时间

    1:在winform上添加状态栏,并且在状态栏目上多添加几个label. step1:拖一个StatusStrip到winform上,名字默认为statusStrip1.找到statusStrip1的 ...

  2. VC2010 中 MFC 的改进导致 XTP 停靠窗体无法显示的解决方法

    XTP( xtreme ToolKit Pro )界面库是基于 MFC 扩展的优秀的界面库,公司的项目一直在使用,但是最近尝试使用 VS2010 编辑工程时发现,停靠窗口居然消失了,跟踪消息发现停靠窗 ...

  3. echarts 饼图取消legend图例的点击事件,保留鼠标悬浮legend上显示tooltie提示信息的事件

    echarts 饼图 因为我在饼图渲染数据的时候对一些数据较小的label和labelLine进行了隐藏,进行了数据的二次处理,所以legend鼠标悬浮显示出tooltie是我所需要的而点击事件,会关 ...

  4. 委托、事件与Observer设计模式

    本文大部分内容转载自:http://www.cnblogs.com/jimmyzhang/archive/2007/09/23/903360.html 假设我们有个高档的热水器,我们给它通上电,当水温 ...

  5. c 读取mysql另一个窗体中显示出来_二级ACCESS数据库4窗体的笔试题考点分析

    注意的考点: 1.窗体的概念: a.窗体的主要作用是接收用户输入的数据或命令,编辑.显示数据库中的数据,构造方便. 美观的输入/输出界面. b.窗体本身没有存储数据,其数据可以来源于表.查询或SQL语 ...

  6. 在access窗体中加图片_如何在Access窗体中显示指定路径的图片

    在Access中,如果把图形对象以OLE格式的字段保存,那么在窗体中可以直接显示出图片来.但是这样做有以下不足:一.需要将图片逐一插入到表中,工作量太大.二.使数据库文件变得庞大.三.相同的图片文件, ...

  7. linux直接渲染管理,使用Linux中的“直接渲染管理器”在dumbbuffer上调用mmap在使用C时失败...

    有一段时间,我一直在使用 Linux' Direct Rendering Manager,这允许我们进行一些非常低级别的图形管理.这通常在C中完成,在 libdrm的帮助下,或直接使用 DRM hea ...

  8. c#中的委托、事件、Func、Predicate、Observer设计模式以及其他

    原文地址:[学习笔记]c#中的委托.事件.Func.Predicate.Observer设计模式以及其他 参考资料: 1. 简单谈谈事件与委托 2. C#中的委托和事件(上) 3. C#中的委托和事件 ...

  9. 设计模式---观察者模式(Observer)和委托事件模型(DEM)

    1 引言 观察者模式,又名发布订阅模式,是一个一对多的关系,当被观察者发生某种变化,对应其观察者做出相应的改变.比如说,某学校研究生实验室有2个学生,2个学生某个上午在实验室,A在玩游戏,B在看电影, ...

最新文章

  1. 基于高分辨率的单目深度估计网络(AAAI2021)
  2. php tp 重加载页面,thinkPHP线上自动加载异常与修复方法实例分析
  3. 彻底解决_OBJC_CLASS_$_某文件名, referenced from:问题
  4. Oracle入门(九A)之用户的权限或角色
  5. java上传kafka的方法_哪种方法是将所有数据从Kafka主题复制到接收器(文件或Hive表)的最佳方法?...
  6. 清华裴丹:AIOps落地路线图
  7. SAP License:MM模块审批策略问题
  8. 任丽萍跟我赌200块钱的
  9. php中splite,PHP语言 的 chunk_split() 函数
  10. (node:3872) [DEP0005] DeprecationWarning: Buffer() is deprecated due to security and usability issue
  11. 怎么打开.pos文件
  12. elasticsearch 出现all shards failed异常?
  13. 一文讲懂蓝绿发布和金丝雀发布
  14. 多目标跟踪入门篇(1):SORT算法详解
  15. 颈椎护理小助手,轻松缓解颈部酸痛,宾多康智能颈枕按摩器体验
  16. 【IoT】NFC 应用技术全面解析
  17. Android应用开发--MP3音乐播放器滚动歌词实现
  18. 计网 - 局域网:NAT 是如何工作的?
  19. 网管员必看:三款常见网管工具的对比
  20. A guided tour of Kerberos: Tutorial

热门文章

  1. android 电池续航时间,《Android优化专题》——优化电池续航能力
  2. 使用严格模式的坏处_再见面试官:单例模式有几种写法?
  3. 【Python-2.7】如何判断对象是否为可迭代?
  4. 【Oracle】truncate分区表
  5. RAISR-master:google图像新压缩技术RAISR的测试代码调试记录(Python实现,没接触过python的小白,内含pip install解决方案)
  6. POI3.8解决导出大数据量excel文件时内存溢出的问题
  7. 如何设置Win11账户密码有效期?Win11账户密码使用期限设置教程
  8. Web项目中前端页面通过URL传中文或 # 特殊字符到后台出现乱码解决方案
  9. 七牛云存储,图片储存
  10. activiti启动流程实例,添加进businessKey