设置权限的时候,主界面是动态加载菜单,但是主界面与别的界面之间有很多数据交流阿。我要把主界面的值传到别的窗体去,或者是别的窗体某写操作,会影响主界面的显示,该怎么做才好阿。主界面代码
        //菜单的单击事件,show出来的窗体
        void tsmi_Click(object sender, EventArgs e)
        {
            //得到当前菜单项的Tag 属性,它表示权限的ID
            string gid = (sender as ToolStripMenuItem).Tag.ToString();            DataRow[] rows = table.Select("gid="+gid);            //得到数据库中窗体的名称
            string formName = rows[0]["formname"].ToString();            //通过反射动态实例化窗体对象
            Form form = Assembly.GetExecutingAssembly().CreateInstance(formName) as Form;            if (this.dgvMain.SelectedRows.Count > 0)        //如果有一行被选中
            {
                if (MyEventShow != null)        //触发事件
                {
                    MyEventShow(GetComputerInfo());     //得到选中行的信息
                }
            }
            form.Show();
        }其中一个界面的代码        public FrmAccountComputer()
        {
            InitializeComponent();
            FrmMain fm = new FrmMain();
            fm.MyEventShow+=new FrmMain.MyDelegate(fm_MyEventShow);
        }
这样子运行,MyEventShow 不触发,为null,请问有好的方法解决这个问题吗。?

解决方案 »

  1.   

    搂主的事件不会触发,是因为下面代码:
                FrmMain fm = new FrmMain();
                fm.MyEventShow+=new FrmMain.MyDelegate(fm_MyEventShow);是重新实例化的一个新的FrmMain对象,已经不是你的主窗口那个对象了
      

  2.   

    搂主可以这样做:private FrmMain m_MainForm = null;
            public FrmAccountComputer(FrmMain fm)
            {
                InitializeComponent();
                this.m_MainForm = fm;
                fm.MyEventShow+=new FrmMain.MyDelegate(fm_MyEventShow);
            }把已有的FrmMain实例传给FrmAccountComputer窗口类即可如果搂主的FrmAccountComputer窗口类里面还有对FrmMain 类的访问的话,就可以直接使用this.m_MainForm 
      

  3.   

    嗯,谢谢。因为是反射创建窗体对象,所以并不好在构造函数中传参数阿。不过好像可以在主窗体中定义一个静态变量吧?
    public static FrmMain fm;
    public FrmMain()
    {
       InitializeComponent();
       fm = this;
    }
    然后在这个窗体订阅事件        public FrmAccountComputer()
            {
                InitializeComponent();
                FrmMain.fm.MyEventShow+=new FrmMain.MyDelegate(fm_MyEventShow);
            }
    这样做法行吗.?
      

  4.   

    这样也是可以的但是搂主别忘了加个析构函数,来及时释放掉这个订阅:
            FrmAccountComputer()
            {
                 FrmMain.fm.MyEventShow -= new FrmMain.MyDelegate(fm_MyEventShow);
            }