状况:
Winforms环境下,我在一个窗体中定义一个字符串errorMessage,当它不为空时,就要调用我的Method()方法,这个模型完整的代码。

解决方案 »

  1.   

    ..........if(errorMessage!=null && errorMessage.Length!=0)Method();.......真不知道你什么意思;
      

  2.   


    private string errorMessage;
    public string ErrorMessage
    {
        get
        {
            if(!string.IsNullOrEmpty(errorMessage))
                Method();
            return errorMessage;
        }
        set
        {
            errorMessage = value;
        }
    }
      

  3.   

    很别扭的实现,不知道LZ想干什么代码如下
    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);
            }
        }
    }
      

  4.   

    看这里吧,认真看完一切就OK了如何:发布符合 .NET Framework 准则的事件(C# 编程指南)
      

  5.   


      if(!string.IsNullOrEmpty(errorMessage)) 
                Method(); 
      

  6.   

    oublic string ErrorMessage
    {
     get{
       if(!string.IsNullOrEmpty(errorMessage)) 
                Method();
      return  errorMessage;
     }
    }
      

  7.   

    首先是,我的问题让很多人误解,是我提问的不清楚。
    我的目的是:理解事件!
    errorMessage发生变化时,触动另一个方法。但是这个过程我不需要判断,也就是不需要
     if(!string.IsNullOrEmpty(errorMessage)) 
                Method(); 
    这种形式,这样的话还得我自己判断。
    我要的,就是"龙宜坡"写的这种别扭的形式.
    扩展一点:C#是系统是怎样得知按钮被点的?调用API,可是API是怎么实现的,它怎么知道的呢?是不是就像做一个计时器,定期不停地扫描呢?那样的话似乎很费资源?
    高手们,系统到底怎样知道按钮被点击的,这个问题困扰很久了!!!!!!!!!
      

  8.   

    回答12楼
    你可以理解一下消息回圈,这里有篇文章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). 
      

  9.   

    看看事件Form1:
    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类
      

  10.   

    把em.method = new ems.mth(yourmethod);
    换成
    em.method += new ems.mth(yourmethod);
    更准确些
      

  11.   

    写个简单点的事件
    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
        }
    }
      

  12.   

    你若果要深入了解这个不是谁一两句话或一两篇文章所能够理解清楚的,Windows底层的消息机制是CPP大拿们常用的玩意,涉及到Windows底层的东西我至今没有明白,可谓知其然不知其所以然!
    问题是我搞明白了对我现在的日常工作没有任何帮助,我没必要去深入理解它们!想看.NET的事件就去MSDN看,很详细,想深入理解.NET的事件,请先看委托!
      

  13.   

    在窗体里自定义事件之所以别扭,因为.NET在Control类里已经封装了很多事件,大部分情况下是够用的!我是很少在窗体上自定义事件的,只有在自己的类里面有时才会用到自定义事件!