public System.Action <TreeNodeBase> OnSelectNodeItemChange;  //当选择的树形节点改变时候



        #region 根据给定的数据源创建树形链表结构

        /// <summary>
        /// 创建树视图结构
        /// </summary>
        /// <param name="items"></param>
        /// <param name="defaultSelectItem"> 默认选中哪一项</param>
        public virtual void CreateTreeView(List <TreeViewNodeInfor> items, int defaultSelectItem)
        {
            m_Index           = 0;
            m_SelectItemIndex = -1;
            m_TempNode.Clear();
            if (items == null || items.Count == 0)
            {
                m_Root = null;
                Debug.Log("CreateTreeView Fail, Node Data Source is Null ");
                return;
            }
            m_SelectItemIndex = defaultSelectItem;
            CreateRootNode();
            RecordGroupNodeInfor(RootNodeName, m_Root);  //记录根节点对应关系

            for (int dex = 0; dex < items.Count; ++dex)
            {
                //    Debug.Log("CreateTreeView  dex=" + dex + ">>>" + items[dex]);
                CreateTreeNode(items[dex], "");
            }

            SearchTreeToRecordTreeNode();   //搜索整棵树结构以便于记录相关数据
        }
 protected virtual void CreateRootNode()
 {
     m_Root = new TreeNodeBase(RootNodeName, null);  //创建根节点
 }
 /// <summary>
 ///  记录节点 并设置正确的索引
 /// </summary>
 /// <param name="node"></param>
 /// <param name="offset">每多一级分类则子类需要偏移一定距离</param>
 protected void RecordTreeNode(TreeNodeBase node, int offset)
 {
     m_AllNode.Add(node);
     node.SetIndex(m_Index, offset);
     ++m_Index;
 }
 /// <summary>
 /// 创建本次遍历获取的叶子节点
 /// </summary>
 /// <param name="parentPath"></param>
 /// <param name="item"></param>
 /// <param name="parentNode"></param>
 /// <param name="splitchar"></param>
 /// <returns></returns>
 protected virtual void CreateLeafNode(string parentPath, TreeViewNodeInfor item, TreeNodeBase parentNode, char splitchar)
 {
     //TreeViewNodeInfor_ActionNode nodeInfor = item as TreeViewNodeInfor_ActionNode;
     //parentPath = parentPath + nodeInfor.m_Arrangenment + splitchar;  //当前需要创建的树节点的完整路径
     //TreeNodeBase node = GetClassficationNodeByName(parentPath);  //判断是否存在这个路径的节点
     //if (node == null)
     //{
     //    node = new TreeNodeBase(nodeInfor.m_Arrangenment, parentNode);  //创建当前节点
     //    RecordClassfication(parentPath, node); //记录当前创建的节点
     //}//当前子目录不存在
 }
        /// <summary>
        /// 创建中间的一个组的父节点  后面会添加其他的叶子节点
        /// </summary>
        /// <param name="parentPath">当前节点所属于的父节点路径</param>
        /// <param name="segmentStr">当前节点名称</param>
        /// <param name="parentNode">父节点</param>
        /// <param name="splitchar">分隔符</param>
        /// <returns></returns>
        protected virtual string CreateGroupNode(string parentPath, string segmentStr, TreeNodeBase parentNode, char splitchar)
        {
            parentPath = parentPath + segmentStr + splitchar;   //当前需要创建的树节点的完整路径
            TreeNodeBase node = GetGroupNodeByName(parentPath); //判断是否存在这个路径的节点

            if (node == null)
            {
                node = new TreeNodeBase(segmentStr, parentNode); //创建当前节点
                RecordGroupNodeInfor(parentPath, node);          //记录当前创建的节点
            }//当前子目录不存在
            return(parentPath);
        }
 public void AddChild(TreeNodeBase node)
 {
     node.m_ParentNode = this;
     m_ChildNodes.Add(node);
 }
        public bool m_IsOpen = true;  //是否是展开状态

        #region 构造函数

        protected TreeNodeBase()
        {
            m_NodeName   = "";
            m_ParentNode = null;
            m_ChildNodes = new List <TreeNodeBase>();
        }