通过事件参数传值

   直接进入主题,今天写代码遇到一个问题。

  上图中,左边是一个窗体,右边是也是一个窗体,都停靠在一个MDI容器中。这个时候我通过点击左边的树,要将树的点击后的结点传给右边的窗体。

  按照平常的思路,我会在构造函数中传值,但问题是 每次点击后都会new一个新窗体,这个显然不符合要求。参考别人的代码,然后决定用事件传递选中结点的值。

  

  既然用到事件,首先必须定义事件

//定义委托
public delegate void ClickEventHander(object sender, ClickEventArgs e);

public Class FrmMenu 
{
public event ClickEventHander NodeMouseClick;

//树节点点击事件
private void tvwSbd_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
{
         if(NodeMouseClick!=null)
                    NodeMouseClick(sender,new ClickEventArgs (e.Node.Tag));//如果已加载事件,则将参数传递过去
         //打开窗体
}
}

//定义Click事件继承于顶级事件
public class ClickEventArgs:EventArgs
    {
        //需要传递的变量
        private  TreeNode _node;
        
        public TreeNode Node{
            get { return _node; }
        }
        public ClickPorjectDEventArgs(TreeNode node)
        {
            this._node= node;
        }
    }



-----------------------------------------------------------------------


/*左边窗体的事情做完了,现在该在右边船体加载事件*/

FrmMenu frmMenu; //左边窗体
MainForm mainForm; //主窗体

 private void InitControls()
        {
            mainForm = this.ParentForm as MainForm; //获取主窗体

            //将两个实例化 
            frmMenu = Portal.gc.Menu;
            mainForm = Portal.gc.MainDialog;

            mainForm = Owner as MainForm;
            frmMenu.NodeMouseClick+=new ClickEventHander(frmMenu_NodeMouseClick);
            this.FormClosed += new FormClosedEventHandler(Logoff);

        }
        string strFileName;
        void frmMenu_NodeMouseClick(object sender, ClickPorjectDEventArgs e)
        {
            // 返回结果 projectid;
            node= e.Node.Tag;
            //
            //得到了传过来的值就可以尽情发挥了
        }
 
        /// <summary>
        /// 关闭窗体后注销事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Logoff(object sender, EventArgs e)
        {
            frmMenu.NodeMouseClick-= new ClickEventHander(frmMenu_NodeMouseClick);
            frmMenu.DockState = dockState;//菜单窗体先前状态;
        }

//启动类
static class Portal
    {
        // Fields
        public static GlobalControl gc = new GlobalControl(); 
        private static Mutex mutex = null;
}

  大体情况就是这样吧,具体细节有待慢慢体会……又是美好的一天

posted @ 2012-08-09 00:27  诸葛风流  阅读(1447)  评论(0编辑  收藏  举报