Observer设计模式中-委托事件-应用在消息在窗体上显示
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 = ; i <= ; i++) {
temperature = i; if (temperature > ) {
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:嘀嘀嘀,水已经 度了:
Alarm:嘀嘀嘀,水已经 度了:
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;
}
Observer设计模式中-委托事件-应用在消息在窗体上显示的更多相关文章
- winform中的状态栏,以及在状态栏目上显示时间
1:在winform上添加状态栏,并且在状态栏目上多添加几个label. step1:拖一个StatusStrip到winform上,名字默认为statusStrip1.找到statusStrip1的 ...
- 观察者(Observer)模式 * 委托事件
观察者(Observer)模式:定义了一种一对多的依赖关系.让多个观察者对象同时监听某一个主题对象. 这个主题对象发生变化时会通知所有观察者对象,使他们字段更新自己 /* * 抽象主题(Subje ...
- 转载:C#中委托、事件与Observer设计模式
原文地址 http://www.tracefact.net/CSharp-Programming/Delegates-and-Events-in-CSharp.aspx 感谢博主分享! 范例说明 假设 ...
- 委托、事件与Observer设计模式
范例说明 上面的例子已不足以再进行下面的讲解了,我们来看一个新的范例,因为之前已经介绍了很多的内容,所以本节的进度会稍微快一些: 假设我们有个高档的热水器,我们给它通上电,当水温超过95度的时候:1. ...
- 《C#高级编程》学习笔记------C#中的事件和委托
本文转载自张子阳 目录 委托的作用 将方法绑定到委托 事件的来由 Observer设计模式 .Net Framework中的委托与事件 引言 委托 和 事件在 .Net Framework中的应用 ...
- C#中委托和事件
目 录 将方法作为方法的参数 将方法绑定到委托 更好的封装性 限制类型能力 范例说明 Observer 设计模式简介 实现范例的Observer 设计模式 .NET 框架中的委托与事件 为什么委托定义 ...
- c#中委托和事件(转)
C# 中的委托和事件 引言 委托 和 事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易.它们就像是一道槛儿,过了这个槛的人,觉得真 ...
- js实例分析JavaScript中的事件委托和事件绑定
我们在学习JavaScript中,难免都会去网上查一些资料.也许偶尔就会遇到“事件委托”(也有的称我“事件代理”,这里不评论谁是谁非.以下全部称为“事件委托”),尤其是在查JavaScript的事件处 ...
- 理解Javascript中的事件绑定与事件委托
最近在深入实践js中,遇到了一些问题,比如我需要为动态创建的DOM元素绑定事件,那么普通的事件绑定就不行了,于是通过上网查资料了解到事件委托,因此想总结一下js中的事件绑定与事件委托. 事件绑定 ...
随机推荐
- php 二维数组(没啥技术含量)
<?php $cars = array( array('benchi',20,18), array('baoma',30,21), array('aodi',23,9) ); echo $car ...
- Semaphore tryAcquire release 正确的使用方法
boolean permit = false; try { permit = semaphore.tryAcquire(1, TimeUnit.SECONDS); if (permit) { Syst ...
- A*算法入门
来源:http://www.cppblog.com/mythit/archive/2009/04/19/80492.aspx 在看下面这篇文章之前,先介绍几个理论知识,有助于理解A*算法. 启发式搜索 ...
- EXT学习之——Ext下拉框绑定无效的问题
1.保证store定义是否在combobox前面 2.有没写 .load 3.有没赋值 xxstore:xxstore 具体看详细步骤 http://www.cnblogs.com/wdw3121 ...
- 转载自@机智的新手:使用Auto Layout中的VFL(Visual format language)--代码实现自动布局
本文将通过简单的UI来说明如何用VFL来实现自动布局.在自动布局的时候避免不了使用代码来加以优化以及根据内容来实现不同的UI. 一:API介绍 NSLayoutConstraint API 1 2 3 ...
- how to monitor system logs and export to files simultaneously
What will you do when you conduct a malware analysis on a smartphone? You will focus on running proc ...
- NHibernate系列文章三:简单的增删改查询
摘要 上一篇文章只完成了简单的NHibernate安装.配置和连接数据库.这篇文章介绍怎样实现最简单的数据库读写操作. 1. 重构ISessionFactory生成过程 将生成ISessionFact ...
- js 小工具-- 获取主机名
<script type="text/javascript"> function getHostName(url) { var host = "null&qu ...
- C#中combobox 控件属性、事件、方法
一 .combobox 属性.事件.方法公共属性 名称 说明 AccessibilityObject 获取分配给该控件的 AccessibleObject. AccessibleDefaultActi ...
- docker中安装ssh服务
系统:Debian Docker 目标:在docker(debian系统)中安装ssh服务,实现远程登陆和控制docker 步骤: 初始状态:通过docker pull debian得到的一个debi ...