作者:爱在运动-666_517 | 来源:互联网 | 2023-09-18 19:16
直接进入主题,今天写代码遇到一个问题。上图中,左边是一个窗体,右边是也是一个窗体,都停靠在一个MDI容器中。这个时候我通过点击左边的树,要将树的点击后的结点传给右边的窗体。按
直接进入主题,今天写代码遇到一个问题。
![](https://img1.php1.cn/3cd4a/24c6f/61b/70c049fe512d9944.jpeg)
上图中,左边是一个窗体,右边是也是一个窗体,都停靠在一个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;
//
//得到了传过来的值就可以尽情发挥了
}
///
/// 关闭窗体后注销事件
///
///
///
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;
}
大体情况就是这样吧,具体细节有待慢慢体会……又是美好的一天