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中的事件绑定与事件委托. 事件绑定 ...
随机推荐
- Python中利用LSTM模型进行时间序列预测分析
时间序列模型 时间序列预测分析就是利用过去一段时间内某事件时间的特征来预测未来一段时间内该事件的特征.这是一类相对比较复杂的预测建模问题,和回归分析模型的预测不同,时间序列模型是依赖于事件发生的先后顺 ...
- go1.6.2 linux/amd64 的一个bug: gcc: 无法识别的选项‘-no-pie’
如果你的linux是中文版的. 即:执行 # echo $LANG 命令,返回的是 zh_CN.UTF-8 则会出现这个bug, 如果是 en_US.UTF-8 则没有这个问题. 这个bug的一个 ...
- E:in-range伪类选择器与E:out-of-range伪类选择器
E:in-range伪类选择器用来指定当元素的有效值被限定在一段范围之内(通常通过min属性值与max属性值来限定),且实际输入值在该范围内时使用的样式.E:out-of-range伪类选择器用来指定 ...
- pow的小事不简单
http://acm.hdu.edu.cn/showproblem.php?pid=5878 #include<stdio.h> #include<iostream> #inc ...
- Bellman-Ford最短路径
对于前面说到的最短路径的求解方法,不能解决负权边的情况,而Bellman-Ford却可以 共有n个顶点,m条边,每次输入u[i],v[i],w[i],代表从u[i]到v[i]的距离是w[i],对于所有 ...
- android开发之单选按钮
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android=&q ...
- express 手动删除session状态(即登出功能)
在退出按钮被点击后,发送请求/logout,服务端做如下处理: app.get('/logout', function() { delete req.session.user; return res. ...
- Java运算符的优先级(从高到低)
运算符的优先级(从高到低) 优先级 描述 运算符 1 括号 ().[] 2 正负号 +.- 3 自增自减,非 ++.--.! 4 乘除,取余 *./.% 5 加减 +.- 6 移位运算 << ...
- web form 控件
webform的简单控件1.Label:文本显示,编译后是span属性:颜色,样式,边线宽度2.Literal:纯文本显示,编译后是text 3.TextBox:文本框TextMode-密码框.文本域 ...
- HttpUtility.UrlEncode