状况:
Winforms环境下,我在一个窗体中定义一个字符串errorMessage,当它不为空时,就要调用我的Method()方法,这个模型完整的代码。
Winforms环境下,我在一个窗体中定义一个字符串errorMessage,当它不为空时,就要调用我的Method()方法,这个模型完整的代码。
解决方案 »
- 如何获得远程IP地址
- 请教实现webbrowser中idispatch接口的invoke方法
- 急。。。。在线等。。。Path.GetFullPath()与windowservice 的问题
- 求助:一个简单的问题
- 开发智能设备一般用哪个模板
- 为何在WinFormr的DataGrid中选择一行后,点删除按钮不能删除数据库的记录呢?
- 求用C#写的看门狗源码
- 防止一个按钮多次点击如何用线程控制(WinForm)
- 数据库问题:如何像用sql语句查询数据源那样来查询在datatable中的数据?
- 大家评论一下C#使用设计模式。
- datagirdview 添加大量数据的效率
- datagridview判断为空值的代码无法生效,请帮忙看一下
private string errorMessage;
public string ErrorMessage
{
get
{
if(!string.IsNullOrEmpty(errorMessage))
Method();
return errorMessage;
}
set
{
errorMessage = value;
}
}
Form1using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;namespace WindowsApplication1
{
public partial class Form1 : Form
{
public event EventHandler<ErrorMessageEventArgs> ErrorMessageChanged; private string m_errorMessage;
public string ErrorMessage
{
get { return this.m_errorMessage; }
set
{
if (!String.IsNullOrEmpty(value))
{
this.m_errorMessage = value;
ErrorMessageEventArgs e = new ErrorMessageEventArgs();
e.Messages = value;
OnErrorMessageChanged(this, e);
}
}
} protected virtual void OnErrorMessageChanged(object sender, ErrorMessageEventArgs e)
{
EventHandler<ErrorMessageEventArgs> handler = ErrorMessageChanged;
if (handler != null)
{
handler(this, e);
}
} public Form1()
{
InitializeComponent();
} private void Form1_Load(object sender, EventArgs e)
{
} private void button1_Click(object sender, EventArgs e)
{
Form2 frm = new Form2(this);
frm.Show();
}
} public class ErrorMessageEventArgs : EventArgs
{
private string m_messges;
public string Messages
{
get { return this.m_messges; }
internal set { this.m_messges = value; }
}
}
}Form2事件的订阅using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;namespace WindowsApplication1
{
public partial class Form2 : Form
{
private Form1 frm1 = null;
public Form2(Form1 frm)
{
InitializeComponent();
this.frm1 = frm;
if (this.frm1 != null)
{
//订阅事件,绑定事件方法
frm1.ErrorMessageChanged += new EventHandler<ErrorMessageEventArgs>(frm1_ErrorMessageChanged);
}
} private void btnSetErrorMessage_Click(object sender, EventArgs e)
{
//改变属性值
frm1.ErrorMessage = btnSetErrorMessage.Text;
} //事件执行的方法
private void frm1_ErrorMessageChanged(object sender, ErrorMessageEventArgs e)
{
string msg = ""; ;
Form1 frm = sender as Form1;
if (frm != null)
{
msg = "事件执行的方法:" +Environment.NewLine + "窗体信息 名称:" + frm.Name + "标题:" + frm.Text;
}
MessageBox.Show(msg + Environment.NewLine + e.Messages);
}
}
}
if(!string.IsNullOrEmpty(errorMessage))
Method();
{
get{
if(!string.IsNullOrEmpty(errorMessage))
Method();
return errorMessage;
}
}
我的目的是:理解事件!
errorMessage发生变化时,触动另一个方法。但是这个过程我不需要判断,也就是不需要
if(!string.IsNullOrEmpty(errorMessage))
Method();
这种形式,这样的话还得我自己判断。
我要的,就是"龙宜坡"写的这种别扭的形式.
扩展一点:C#是系统是怎样得知按钮被点的?调用API,可是API是怎么实现的,它怎么知道的呢?是不是就像做一个计时器,定期不停地扫描呢?那样的话似乎很费资源?
高手们,系统到底怎样知道按钮被点击的,这个问题困扰很久了!!!!!!!!!
你可以理解一下消息回圈,这里有篇文章http://www.winprog.org/tutorial/message_loop.html 可惜没找到关于c#的,c#里这个概念被淡化了事实上 就是像你说的那样“不停地扫描”,但并不“很费资源”。
The message loop calls GetMessage(), which looks in your message queue. If the message queue is empty your program basically stops and waits for one (it Blocks).
ems em = new ems();public Form1()
{
InitializeComponent();
em.method = new ems.mth(yourmethod);
}
private void button1_Click(object sender, EventArgs e)
{ em.errorMessage = "any"; }
private void yourmethod()
{
Console.WriteLine("OK");
}
class ems
{
public delegate void mth();
public mth method;
private string str;
public ems()
{
}
public string errorMessage
{
get
{
return str;
}
set{
if (str != value)
method();
str = value;
}
}
}你要想监视 string errorMessage
恐怕得重新string类
换成
em.method += new ems.mth(yourmethod);
更准确些
class Error
{
event EventHandler EmptyValue;
string errString;
public string ErrString
{
get{return errString;}
set
{
if(String.IsNullOrEmpty(value)==true && EmptyValue!null)
EmptyValue(this,new EventArgs());
errString = value;
}
}
}
class CallError
{
Error e = new Error();
public CallError()
{
e.EmptyValue += new EnventHanlder(this.Method);
}
private void Method(object sender, EventArgs e)
{
//do what you want
}
}
问题是我搞明白了对我现在的日常工作没有任何帮助,我没必要去深入理解它们!想看.NET的事件就去MSDN看,很详细,想深入理解.NET的事件,请先看委托!