winform  左侧:treeview  工作区:panel 
其中treeview动态生成,我想点击treeview中的节点,工作区中自动加载该节点对应的UserControl; 怎么做比较简洁。。要详细代码。。

解决方案 »

  1.   

    存放树的类,这里可以读取数据库,按规范存放数据。      /// <summary>
        /// 实体类 客户信息树形视图展现
        /// </summary>
       public class ZBZone:BasicCheck,ICloneable
        { 
          public ZBZone() { }
     public object Clone()
          {
              return this.MemberwiseClone();
          }
          private string parentid;
          /// <summary>
          /// 父节点名称
          /// </summary>
          public string ParentID
          {
              get { return parentid; }
              set { 
                 if(value.ToString().IndexOf(',')!=-1)
                  parentid = value; 
                }
          }      private string codeid;
           /// <summary>
           ///用户id号
           /// </summary>
          public string CodeID
          {
              get { return codeid; }
              set { codeid = value; }
          }      private string codename;
           /// <summary>
           ///用户名称
           /// </summary>
          public string CodeName
          {
              get { return codename; }
              set { codename = value; }
          }    }
    /// <summary>
            /// 构造父节点树
            /// </summary>
            /// <param name="trc">树集合</param>
            /// <param name="lzb">实体集合</param>
            private void TreeViewLoad(TreeNodeCollection trc,List<ZBZone> lzb)
            {
                treeview_customer.Nodes.Clear();
                foreach (ZBZone zb in lzb)
                {
                    int icount = zb.ParentID.Split(',').Count();
                    if (icount == 2)
                    {
                        TreeNode tn = new TreeNode(zb.CodeName);
                        tn.Tag = zb;//设置tag属性   
                        tn.ImageIndex = 0;
                      
                        trc.Add(tn);
                        treeview_customer.Nodes[0].ExpandAll();
                        
                    }
                    else
                    {
                        InitChildNode(trc[trc.Count - 1].Nodes,zb,zb.ParentID);
                    }
                }
            }
            /// <summary>
            /// 递归构造子节点
            /// </summary>
            /// <param name="trchild">父节点集合</param>
            /// <param name="strparent">parentid长度</param>
            /// <param name="name">节点名称</param>
            private void InitChildNode(TreeNodeCollection trchild, ZBZone zbz,string parentid)
            {
                string stemp = parentid;
                if (stemp.IndexOf(',') != 0)
                    {
                            stemp = stemp.Substring(0, stemp.LastIndexOf(','));
                            int icount = stemp.Split(',').Count();
                            if (icount ==2)
                            {
                                TreeNode tn1 = new TreeNode(zbz.CodeName);   
                                tn1.Tag = zbz;
                                trchild.Add(tn1);
                            }
                            else
                            {
                                InitChildNode(trchild[trchild.Count - 1].Nodes, zbz, stemp);
                            }
                    }
            }//加载树  调用
     
                List<ZBZone> zbzone = new List<ZBZone>();
                zbzone.AddRange(new ZBZone[]
                    {new ZBZone{  ParentID="1,1" ,CodeID="1", CodeName="ONE"},
                    new ZBZone{  ParentID="1,1,1" ,CodeID="2", CodeName="ONE-1"},
                    new ZBZone{  ParentID="1,1,1,2" ,CodeID="5", CodeName="ONE-1-2"},
                    new ZBZone{  ParentID="2,2" ,CodeID="6", CodeName="TWO"}});
                   TreeViewLoad(treeview_customer.Nodes, zbzone);//树名称
      

  2.   

    动态绑定事件在创建TreeView后
    treeView1.AfterSelect += new TreeViewEventHandler(MyAfterSelected);        private void MyAfterSelected(object sender, TreeViewEventArgs e)
            {
                //这里加载你的东西
            }
      

  3.   

    treeView.SelectedNode.Parent.Index;  //这个是获取父节点ID
    然后通过这个ID获取数据库中的信息
    然后将获取到的信息添加到panel的容器里面以上所说的在同一事件内完成 就能达到自动加载的效果了
      

  4.   

    Node的Tag属性,你的控件名,然后反射实例
      

  5.   

    绑定treeView1时将要用的信息绑定在节点的tag属性中
    treeView1.AfterSelect += new TreeViewEventHandler(MyAfterSelected);private void MyAfterSelected(object sender, TreeViewEventArgs e)
    {
    通过选择不同节点获取tag中的信息来加载不同的UserControl
    }
      

  6.   

    在你的显示区域定义一个委托: public delegate void MainFormChange(UserControl WorkUserControl);
    同时在树菜单定义好事件,在使用的使用注册,实现方法为以下代码
    private void WorkAreaChange(UserControl UserCtl)
            {
                panel.Controls.Clear();   
                UserCtl.Dock = DockStyle.Fill;
                this.panel.Controls.Add(UserCtl);
            }至于在数菜单点击得到相应的要加载的控件,楼上已经说了可以通过反射来完成。