/// <summary>
        /// 构建树
        /// </summary>
        /// <param name="parentNode">父节点</param>
        /// <param name="lstDepInfo">部门信息列表</param>
        void BuildTree(TreeNode parentNode, List <MaterialTypeData> lstDepotInfo)
        {
            bool isLeaf = false;

            MaterialTypeData parentDepInfo = parentNode.Tag as MaterialTypeData;

            int nodeGrade = Convert.ToInt32(parentDepInfo.MaterialTypeGrade);

            for (int i = 0; i < lstDepotInfo.Count; i++)
            {
                if (nodeGrade + 1 == Convert.ToInt32(lstDepotInfo[i].MaterialTypeGrade))
                {
                    TreeNode node = new TreeNode();

                    UpdateTreeNode(node, lstDepotInfo[i]);

                    isLeaf = (bool)lstDepotInfo[i].IsEnd;

                    parentNode.Nodes.Add(node);

                    lstDepotInfo.RemoveAt(i);

                    i--;

                    if (!isLeaf)
                    {
                        BuildTree(node, lstDepotInfo);
                    }
                }
                else
                {
                    break;
                }
            }
        }
        /// <summary>
        /// 从材料类别列表中更新指定材料类别
        /// </summary>
        /// <param name="depCode">要更新材料类别的编码</param>
        /// <param name="info">更新后的信息</param>
        private void UpdateItemFromDepotList(string depotCode, MaterialTypeData info)
        {
            int index = -1;

            m_findDepotCode        = depotCode;
            index                  = m_listDepotInfo.FindIndex(this.FindDepotListData);
            m_listDepotInfo[index] = info;
        }
        /// <summary>
        /// 从界面获取材料类别信息
        /// </summary>
        /// <returns>获取到的材料类别信息</returns>
        private MaterialTypeData GetDepotInfoFromFace()
        {
            MaterialTypeData info = new MaterialTypeData();

            info.MaterialTypeCode  = txtCode.Text;
            info.MaterialTypeName  = txtName.Text;
            info.MaterialTypeGrade = info.MaterialTypeCode.Length / 2 - 1;

            return(info);
        }
 /// <summary>
 /// 查找符合条件的部门信息列表数据
 /// </summary>
 /// <param name="info">检索的信息</param>
 /// <returns>当前检索项目符合条件返回true, 其它为false</returns>
 private bool FindDepotListData(MaterialTypeData info)
 {
     if (info.MaterialTypeCode.CompareTo(m_findDepotCode) == 0)
     {
         return(true);
     }
     else
     {
         return(false);
     }
 }
        /// <summary>
        /// 获取指定材料类别信息在树中的父节点
        /// </summary>
        /// <param name="info">要获取父节点的材料类别信息</param>
        /// <returns>成功返回父节点, 失败返回null</returns>
        private TreeNode GetParentNode(MaterialTypeData info)
        {
            if (info.MaterialTypeCode.Length == m_CodeChars[0])
            {
                return(null);
            }

            string   upperDepotCode = info.MaterialTypeCode.Substring(0, info.MaterialTypeCode.Length - 2);
            TreeNode parentNode     = treeView.Nodes.Find(upperDepotCode, true)[0];

            return(parentNode);
        }
        /// <summary>
        /// 树节点选中后触发该事件
        /// </summary>
        /// <param name="sender">触发此事件的对象</param>
        /// <param name="e">事件参数</param>
        private void treeView_AfterSelect(object sender, TreeViewEventArgs e)
        {
            TreeNode selNode = treeView.SelectedNode;

            // 是根节点
            if (selNode == treeView.Nodes[0])
            {
                InitSetting(false);
                return;
            }

            InitSetting(true);

            MaterialTypeData info = selNode.Tag as MaterialTypeData;

            txtCode.Text = info.MaterialTypeCode;
            txtName.Text = info.MaterialTypeName;
        }
        /// <summary>
        /// 更新材料类别信息
        /// </summary>
        /// <param name="err">错误信息, 没有错误该值为null</param>
        /// <returns>成功返回true</returns>
        bool UpdataDepot(out string err)
        {
            MaterialTypeData info = GetDepotInfoFromFace();

            info.MaterialTypeCode  = CurrentDepotInfo.MaterialTypeCode;
            info.MaterialTypeGrade = CurrentDepotInfo.MaterialTypeGrade;
            info.IsEnd             = CurrentDepotInfo.IsEnd;

            if (m_depotServer.UpdataMaterialType(info, out err))
            {
                UpdateTreeNode(CurrentTreeNode, info);

                // 从信息列表中更新元素
                UpdateItemFromDepotList(info.MaterialTypeCode, info);

                return(true);
            }

            return(false);
        }
        /// <summary>
        /// 将材料类别信息添加到一个新的树节点
        /// </summary>
        /// <param name="info">材料类别信息类</param>
        private void AddTreeNode(MaterialTypeData info)
        {
            TreeNode parentNode = null;

            if (info.MaterialTypeGrade == 0)
            {
                parentNode = treeView.Nodes[0];
            }
            else
            {
                parentNode = GetParentNode(info);
            }

            if (parentNode != null)
            {
                TreeNode childNode = new TreeNode();

                UpdateTreeNode(childNode, info);

                parentNode.Nodes.Add(childNode);
            }
        }
 /// <summary>
 /// 更新树节点信息
 /// </summary>
 /// <param name="node">要更新的树节点</param>
 /// <param name="info">更新后的信息</param>
 private void UpdateTreeNode(TreeNode node, MaterialTypeData info)
 {
     node.Name = info.MaterialTypeCode;
     node.Text = string.Format("({0}) {1}", node.Name, info.MaterialTypeName);
     node.Tag  = info;
 }
        /// <summary>
        /// 删除
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnDelete_Click(object sender, EventArgs e)
        {
            if (CurrentDepotInfo.MaterialTypeGrade == 0)
            {
                MessageDialog.ShowPromptMessage("1级材料类别目录不允许删除!");
                return;
            }

            if (CurrentTreeNode == null || CurrentDepotInfo == null)
            {
                MessageDialog.ShowPromptMessage("请选中要删除的材料类别后再操作");
                return;
            }

            if (CurrentTreeNode.Nodes.Count > 0)
            {
                MessageDialog.ShowPromptMessage(string.Format("材料类别[{0}]下还存在子材料类别, 只能删除不存在子材料类别的节点",
                                                              CurrentDepotInfo.MaterialTypeCode));
                return;
            }

            if (DialogResult.No == MessageDialog.ShowEnquiryMessage(string.Format("您是否确定要删除部门[({0}){1}]",
                                                                                  CurrentDepotInfo.MaterialTypeCode, CurrentDepotInfo.MaterialTypeName)))
            {
                return;
            }

            MaterialTypeData parentDepotInfo = CurrentTreeNode.Parent.Tag as MaterialTypeData;

            if (CurrentTreeNode.Parent.Nodes.Count == 1 && CurrentTreeNode.Parent.Name != "材料类别")
            {
                parentDepotInfo = parentDepotInfo.Clone() as MaterialTypeData;

                // 修改父节点的IsEnd属性
                parentDepotInfo.IsEnd = true;

                if (!m_depotServer.DeleteMaterialType(CurrentDepotInfo.MaterialTypeCode, parentDepotInfo, out m_err))
                {
                    MessageDialog.ShowErrorMessage(m_err);
                    return;
                }

                CurrentTreeNode.Parent.Tag = parentDepotInfo;
            }
            else
            {
                if (!m_depotServer.DeleteMaterialType(CurrentDepotInfo.MaterialTypeCode, out m_err))
                {
                    MessageDialog.ShowErrorMessage(m_err);
                    return;
                }
            }

            // 从信息列表中移除元素
            m_findDepotCode = CurrentDepotInfo.MaterialTypeCode;
            int index = m_listDepotInfo.FindIndex(this.FindDepotListData);

            m_listDepotInfo.RemoveAt(index);

            CurrentTreeNode.Parent.Nodes.Remove(CurrentTreeNode);
        }
        /// <summary>
        /// 添加
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnAdd_Click(object sender, EventArgs e)
        {
            if (!CheckInputItem(out m_err))
            {
                MessageDialog.ShowErrorMessage(m_err);
                return;
            }

            if (!CheckDepotCode(txtCode.Text, out m_err))
            {
                MessageDialog.ShowErrorMessage(m_err);
                return;
            }

            if (IsExistDepotCode(txtCode.Text))
            {
                txtCode.Focus();
                MessageDialog.ShowErrorMessage("部门编码已经存在, 不允许添加相同的编码");
                return;
            }

            if (!CheckDepotName(txtName.Text, out m_err))
            {
                txtName.Focus();
                MessageDialog.ShowErrorMessage(m_err);
                return;
            }

            // 从界面上获取材料类别信息
            MaterialTypeData info = GetDepotInfoFromFace();

            // 添加的节点必然是叶子节点
            info.IsEnd = true;

            TreeNode parentNode = GetParentNode(info);

            if (parentNode != null)
            {
                MaterialTypeData parentDepotInfo = parentNode.Tag as MaterialTypeData;

                parentDepotInfo = parentDepotInfo.Clone() as MaterialTypeData;

                // 修改父节点的IsEnd属性
                parentDepotInfo.IsEnd = false;

                if (!m_depotServer.AddMaterialType(info, parentDepotInfo, out m_err))
                {
                    MessageDialog.ShowErrorMessage(m_err);
                    return;
                }

                // 更新树节点的绑定数据
                parentNode.Tag = parentDepotInfo;

                // 从部门列表中更新父节点信息
                UpdateItemFromDepotList(parentDepotInfo.MaterialTypeCode, parentDepotInfo);
            }
            else
            {
                if (!m_depotServer.AddMaterialType(info, out m_err))
                {
                    MessageDialog.ShowErrorMessage(m_err);
                    return;
                }
            }

            AddTreeNode(info);
            m_listDepotInfo.Add(info);
            InitSetting(false);
            this.treeView.ExpandAll();
        }