通过事件参数传值
直接进入主题,今天写代码遇到一个问题。
上图中,左边是一个窗体,右边是也是一个窗体,都停靠在一个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; }
大体情况就是这样吧,具体细节有待慢慢体会……又是美好的一天