我在Form_A的公共区定义了系统托盘控件:
public System.Windows.Forms.NotifyIcon TrayIcon;
然后在Form_A的load事件中:
MenuItem [ ] mnuItms = new  MenuItem [2] ;
            
mnuItms [ 0 ] = new MenuItem ( ) ; 

mnuItms [ 1 ] = new MenuItem ( ) ; 
mnuItms [ 1 ] .Text = "开始caspspace" ; 
mnuItms [ 1 ] .Click += new System.EventHandler (mnuItms1_click) ;  //为托盘程序加入设定好的ContextMenu对象
这时在别的方法内,用TrayIcon.ContextMenu.MenuItems [1].Enabled =false;的语句修改属性没有问题。
但是现在我在Form_A的类中写了另外的方法b,它是Form_b中send事件的处理程序,然后在Form_B的按钮事件中触发send事件,但方法b中的TrayIcon.ContextMenu.MenuItems [1].Enabled =false;语句就通不过了,提示:未将对引用设置到对象的实例
急死我了,怎么回事?我该怎么办?
各位大大指点!不甚感激!

解决方案 »

  1.   

    formA和formB是两个不同的类,TrayIcon是formA的非静态的公共变量,如果你要在formB中使用它,那么你必须先在fromB中实例化一个formA,例如formA newFrom=new formA(),然后再使用此种形式调用TrayIcon:newForm.TrayIcon.bulabulabula........
      

  2.   

    我上面有一句写错了,方法b也是在Form_A类中的,是Form_A中事件send的处理程序,只不过在Form_B中的按钮事件中触发
      

  3.   

    你是说formB中的事件注册了formA中的处理程序?
      

  4.   


    我揣测,你的formB是不是有两个按钮,当“操作”按钮单击之后,formB关闭的同时程序做一些处理,这种处理实际上也就是“开始caspspace”,所以此时contextmenu的“开始caspspace”要false;而另一个按钮就是“取消”操作。如果我的揣测是对的,那么你可以在formA中以DialogShow()(可能拼写不准确)的方式打开formB的实例,看formB实例(注意是formB 窗 体 的实例)的DialogResult属性值是否为DialogResult.OK,如果是的话,就修改contextmenu。
    上述都发生在fromA中,前提条件是要将formB中“操作”按钮的DialogResult属性要设置为OK。
      

  5.   

    我的formB没有两个按钮,而且在formB的其它事件中触发fromA的send事件也一样报错。
    天哪,急死我了!
    各位大大快帮我想想办法,拜托了!
      

  6.   

    “formB的其它事件中触发fromA的send事件”——这样处理很荒谬!!
      

  7.   

    可能我的实际应用还不多,所以感觉你这种方式有点特别。就我而言,如果一个事件处理程序会复用的话,我可能会封装成单独的类。就你的问题,按我的推测,这个formA不是静态的,要使用它里面定义的事件处理程序,首先要实例化,然后在给formB的某控件注册事件处理程序的时候使用 formA的某实例.某处理程序 的方式来进行委托。
      

  8.   

    to  mumuliang(CR苏杭)
    虽然你也没讲出个道道,但还是感谢,分大部分给你了,笑纳!
      

  9.   

    偶今天看书发现了这样一段
    “事件可以有许多订阅的处理程序,在该事件发生时,这些处理程序都会被调用,其中包括引发该事件的对象所在的类的事件处理程序,但事件处理程序也可能在其他类中。”
    以前看的时候确实没注意到。。*^ ^*照我的理解,调用其他类的事件处理程序,跟调用其他类的变量的方法一样。要看这个事件处理程序是不是public,是才能被调用;然后看该类是不是static的,如果是,则可以直接使用类名调用,如果不是就要先new一个实例,然后通过这个实例来调用。