/// <summary>
 /// Сообщает родительскому элементу об изменении состояния текущего элемента
 /// </summary>
 /// <param name="changedMember">элемент, который самым первым изменил свое состояние</param>
 private void Raise_ChildSelectStateChanged(OlapMemberInfo changedMember)
 {
     //Отправляем это событие родителю передаем дальше элемент, который изначально инициировал событие
     if (Parent != null)
     {
         Parent.ChildSelectStateChanged(this, changedMember);
     }
 }
        /// <summary>
        /// Генерирует событие - изменилось состояние всей иерархии элементов
        /// </summary>
        protected void Raise_HierarchyStateChanged(OlapMemberInfo sender)
        {
            StateChangedEventHandler handler = this.HierarchyStateChanged;

            if (handler != null)
            {
                handler(sender);
            }
        }
        /// <summary>
        /// Родительский элемент OlapMemberInfo
        /// </summary>
        private void SetParentOlapMemberInfo(OlapMemberInfo parent)
        {
            this.m_Parent = parent;

            if (Parent != null)
            {
                SetStateByParent();
            }
        }
        /// <summary>
        /// Добавляет элемент в коллекцию дочерних OlapMemberInfo
        /// </summary>
        /// <param name="memberInfo"></param>
        public void AddChild(OlapMemberInfo memberInfo)
        {
            if (Root != null && Root is RootOlapMemberInfo)
            {
                ((RootOlapMemberInfo)Root).AllMembers[memberInfo.UniqueName] = memberInfo;
            }

            Children[memberInfo.UniqueName] = memberInfo;
            memberInfo.SetParentOlapMemberInfo(this);
        }
 /// <summary>
 /// Сообщает дочерним элементам об изменении состояния текущего элемента
 /// </summary>
 /// <param name="changedMember">элемент, который самым первым изменил свое состояние</param>
 private void Raise_ParentSelectStateChanged(OlapMemberInfo changedMember)
 {
     //Отправляем это событие дальше дочерним, передаем дальше элемент, который изначально инициировал событие
     if (Children != null)
     {
         foreach (OlapMemberInfo memberInfo in Children.Values)
         {
             memberInfo.ParentSelectStateChanged(this, changedMember);
         }
     }
 }
        /// <summary>
        /// Возвращает родительские элементы иерархии
        /// </summary>
        /// <param name="useRoot">true - с учетом RootOlapMemberInfo, false - без RootOlapMemberInfo</param>
        /// <returns></returns>
        public IList <OlapMemberInfo> GetAscendants(bool useRoot)
        {
            IList <OlapMemberInfo> ascendants = new List <OlapMemberInfo>();

            OlapMemberInfo parent = this;

            while (parent.Parent != null)
            {
                parent = parent.Parent;

                if (parent is RootOlapMemberInfo && useRoot == false)
                {
                    continue;
                }

                ascendants.Add(parent);
            }
            return(ascendants);
        }
        public MemberTreeNode(OlapMemberInfo info, bool useMultiSelect)
            : base(useMultiSelect)
        {
            if (info == null)
                throw new ArgumentNullException("info");
            m_MemberInfo = info;

            if (info.Info != null && info.Info != null)
                Text = MemberInfo.Info.Caption;
            else
                Text = String.Empty;

            // В случае множ. выбора клик на иконке используем для изменения состояния
            m_ItemCtrl.IconClick += new EventHandler(item_ctrl_IconClick);

            if (useMultiSelect)
            {
                UpdateNodeIcon();
            }

            info.StateChanged += new OlapMemberInfo.StateChangedEventHandler(info_StateChanged);
        }
        /// <summary>
        /// Функция вызывается родителем для дочерних для сигнализации о том что како-либо родительский OlapMemberInfo переведен в новое состояние
        /// </summary>
        /// <param name="changedMember">Элемент, который первым изменил состояние</param>
        private void ParentSelectStateChanged(OlapMemberInfo sender, OlapMemberInfo changedMember)
        {
            bool changed = false;

            switch (changedMember.SelectState)
            {
            case SelectStates.Selected_Self:
                break;

            case SelectStates.Not_Selected:
                changed = SetState(SelectStates.Not_Initialized);
                if (changed)
                {
                    Raise_ParentSelectStateChanged(changedMember);
                }
                break;

            case SelectStates.Selected_With_Children:
                if (HasChildren)
                {
                    SetState(SelectStates.Selected_By_Parent_With_Children);
                }
                else
                {
                    SetState(SelectStates.Selected_By_Parent);
                }
                Raise_ParentSelectStateChanged(changedMember);
                break;

            case SelectStates.Not_Initialized:
                changed = SetState(SelectStates.Not_Initialized);
                if (changed)
                {
                    Raise_ChildSelectStateChanged(changedMember);
                }
                break;
            }
        }
        /// <summary>
        /// Родительский элемент OlapMemberInfo
        /// </summary>
        private void SetParentOlapMemberInfo(OlapMemberInfo parent)
        {
            this.m_Parent = parent;

            if (Parent != null)
            {
                SetStateByParent();
            }
        }
예제 #10
0
        /// <summary>
        /// Добавляет элемент в иерархию MemberNodeInfo
        /// </summary>
        /// <param name="member">Member, информация о котором должна быть добавлена в иерархию</param>
        public OlapMemberInfo AddMemberToHierarchy(MemberData info)
        {
            //Задача: Добавить OlapMemberInfo в иерархию
            //Возможные варианты:
            //	- если элемент в иерархии уже есть, то выход
            //	- если элемента в иерархии еще нет, то ищем его родителя.
            //	  Если Родитель задан, Но родителя в иерархии тоже нет, то добавляем родителя и ищем дальше следующего родителя рекурсивно
            //	  Если родитель не задан, то элемент является корневым (одним из корневых) в иерархии
            //Таким образом в иерархию добавляется не только элемент, но и полностью ветка его родителей (если ее не было)

            //Ищем информацию о данном члене измерения в загруженной иерархии
            OlapMemberInfo memberInfo = FindMember(info.UniqueName);

            //Если элемент в иерархии не найден, то его нужно добавить
            if (memberInfo == null)
            {
                //Создаем OlapMemberInfo
                memberInfo = new OlapMemberInfo(info);
                // Подписываемся у каждого добавленного элемента на событие - изменение состояния всей иерархии
                // данное событие генерит элемент, послуживший инициатором рекурсивного обновления состояний в дереве
                memberInfo.HierarchyStateChanged += new StateChangedEventHandler(memberInfo_HierarchyStateChanged);

                //OlapMemberInfo, который будем использовать для формирования ветки ....->Дед->Отец->Изначально добавляемый мембер
                //Ветку будем формировать при поиске родительских элементов
                OlapMemberInfo addedHierarchy = memberInfo;

                bool foundParentHierarchy = true;
                while (foundParentHierarchy)
                {
                    String parentUniqueName = String.Empty;
                    if (addedHierarchy.Info != null)
                    {
                        PropertyData prop = addedHierarchy.Info.GetMemberProperty(MemberData.PARENT_UNIQUE_NAME_PROPERTY);
                        if (prop != null && prop.Value != null)
                        {
                            parentUniqueName = prop.Value.ToString();
                        }
                    }

                    if (String.IsNullOrEmpty(parentUniqueName))
                    {
                        // В случае если например в мерархию загружены элементы уровня 1 и потом догружается элемент All,
                        // то получится что в коллекции корневых элементов находятся элементы уровней 0 и 1. Чтобы такого не произошло
                        // после добавления просматриваем коллекцию корневых элементов и проверяем не является данный добавленный элемент родителем для кого-нибудь из уже имеющихся
                        // Если дочерние обнаружены, то они удаляются из корневых и добавляются в дочерние к данному элементу.

                        // Ищем среди корневых элементы дочерние для данного
                        Dictionary <String, OlapMemberInfo> toDelete = new Dictionary <string, OlapMemberInfo>();
                        foreach (var child in Children.Values)
                        {
                            String pun = String.Empty;
                            if (child.Info != null)
                            {
                                PropertyData prop = child.Info.GetMemberProperty(MemberData.PARENT_UNIQUE_NAME_PROPERTY);
                                if (prop != null && prop.Value != null)
                                {
                                    pun = prop.Value.ToString();
                                }
                            }
                            if (!String.IsNullOrEmpty(pun) && pun == addedHierarchy.UniqueName)
                            {
                                toDelete.Add(child.UniqueName, child);
                            }
                        }

                        // Удаляем из коллекции корневых дочерние элементы
                        foreach (var del in toDelete)
                        {
                            Children.Remove(del.Key);
                        }

                        // Добавляем в коллекцию корневых элементов
                        AddChild(addedHierarchy);

                        // Добавляем в дочерние те элементы, которые были до этого корневыми
                        foreach (var del in toDelete)
                        {
                            addedHierarchy.AddChild(del.Value);
                        }

                        foundParentHierarchy = false;
                        break;
                    }
                    else
                    {
                        OlapMemberInfo parentOlapMemberInfo = null;
                        parentOlapMemberInfo = FindMember(parentUniqueName);

                        //если родитель найден, то добавляем ему нашу сформированную ветку в дочерние
                        if (parentOlapMemberInfo != null)
                        {
                            parentOlapMemberInfo.AddChild(addedHierarchy);

                            foundParentHierarchy = false;
                            break;
                        }
                        else
                        {
                            //Добавляем в коллекцию корневых элементов
                            AddChild(addedHierarchy);
                            foundParentHierarchy = false;
                            break;
                            //throw new Exception(String.Format("Родитель для элемента {0} не найден в иерархии", info.Member.UniqueName));

                            ////Создаем OlapMemberInfo для родителя
                            //parentOlapMemberInfo = new OlapMemberInfo(addedHierarchy.Member.Parent, Mode, addedHierarchy.Member.Parent.ChildCount);
                            ////Добавляем ненайденного родителя в ветку, которую нужно добавить в иерархию
                            //parentOlapMemberInfo.AddChildOlapMemberInfo(addedHierarchy);

                            ////В этом случае мы иерархию строим руками и нужно явно добавлять в коллекцию memberInfoHierarchy.AllMembers
                            //memberInfoHierarchy.AllMembers[addedHierarchy.UniqueName] = addedHierarchy;

                            //addedHierarchy = parentOlapMemberInfo;
                        }
                    }
                }
            }

            return(memberInfo);
        }
예제 #11
0
 void memberInfo_HierarchyStateChanged(OlapMemberInfo sender)
 {
     Raise_HierarchyStateChanged(sender);
 }
        /// <summary>
        /// Функция вызывается дочерним для родителя для сигнализации о том что како-либо дочерний OlapMemberInfo переведен в новое состояние
        /// </summary>
        /// <param name="changedMember">Элемент, который первым изменил состояние</param>
        private void ChildSelectStateChanged(OlapMemberInfo sender, OlapMemberInfo changedMember)
        {
            bool changed = false;
            switch (changedMember.SelectState)
            {
                case SelectStates.Selected_Self:
                    if (SelectState == SelectStates.Selected_Self && AllChildrenIsSelected)
                    {
                        SetNewState(SelectStates.Selected_With_Children);
                    }
                    else
                    {
                        if (SelectState == SelectStates.Not_Initialized ||
                            SelectState == SelectStates.Not_Selected)
                        {
                            changed = SetState(SelectStates.Labeled_As_Parent);
                        }
                        if (changed)
                            Raise_ChildSelectStateChanged(changedMember);
                    }
                    break;
                case SelectStates.Not_Selected:
                case SelectStates.Not_Initialized:
                    if (this.HasSelectedChildren == false)
                    {
                        if (SelectState == SelectStates.Labeled_As_Parent)
                        {
                            changed = SetState(SelectStates.Not_Initialized);
                            Raise_SetChildrenState(SelectStates.Not_Initialized, false);

                            if (changed)
                                Raise_ChildSelectStateChanged(changedMember);
                            break;
                        }
                    }

                    if (HasSelectedChildren == false && AllChildrenIsLoaded == true)
                    {
                        switch (SelectState)
                        {
                            case SelectStates.Selected_With_Children:
                            case SelectStates.Selected_With_Children_Has_Excluded:
                                changed = SetState(SelectStates.Selected_Self);
                                Raise_SetChildrenState(SelectStates.Not_Initialized, false);
                                break;
                            case SelectStates.Selected_By_Parent_With_Children:
                            case SelectStates.Selected_By_Parent_With_Children_Has_Excluded:
                                changed = SetState(SelectStates.Selected_By_Parent);
                                break;
                        }
                    }
                    else
                    {
                        switch (SelectState)
                        {
                            case SelectStates.Selected_With_Children:
                                changed = SetState(SelectStates.Selected_With_Children_Has_Excluded);
                                break;
                            case SelectStates.Selected_By_Parent_With_Children:
                                changed = SetState(SelectStates.Selected_By_Parent_With_Children_Has_Excluded);
                                break;
                        }
                    }
                    if (changed)
                        Raise_ChildSelectStateChanged(changedMember);
                    break;
                case SelectStates.Selected_With_Children:
                    if (SelectState == SelectStates.Selected_Self && AllChildrenIsSelected)
                    {
                        SetNewState(SelectStates.Selected_With_Children);
                    }
                    else
                    {
                        if (SelectState == SelectStates.Not_Initialized ||
                            SelectState == SelectStates.Not_Selected)
                        {
                            changed = SetState(SelectStates.Labeled_As_Parent);
                        }
                        else
                        {
                            if (HasExcludedChildren == false)
                            {
                                if (SelectState == SelectStates.Selected_With_Children_Has_Excluded)
                                {
                                    changed = SetState(SelectStates.Selected_With_Children);
                                    Raise_ParentSelectStateChanged(this);
                                }
                                if (SelectState == SelectStates.Selected_By_Parent_With_Children_Has_Excluded)
                                    changed = SetState(SelectStates.Selected_By_Parent_With_Children);
                            }
                        }
                        if (changed)
                            Raise_ChildSelectStateChanged(changedMember);
                    }
                    break;
            }
        }
 /// <summary>
 /// Функция вызывается родителем для дочерних для сигнализации о том что како-либо родительский OlapMemberInfo переведен в новое состояние
 /// </summary>
 /// <param name="changedMember">Элемент, который первым изменил состояние</param>
 private void ParentSelectStateChanged(OlapMemberInfo sender, OlapMemberInfo changedMember)
 {
     bool changed = false;
     switch (changedMember.SelectState)
     {
         case SelectStates.Selected_Self:
             break;
         case SelectStates.Not_Selected:
             changed = SetState(SelectStates.Not_Initialized);
             if (changed)
             {
                 Raise_ParentSelectStateChanged(changedMember);
             }
             break;
         case SelectStates.Selected_With_Children:
             if (HasChildren)
                 SetState(SelectStates.Selected_By_Parent_With_Children);
             else
                 SetState(SelectStates.Selected_By_Parent);
             Raise_ParentSelectStateChanged(changedMember);
             break;
         case SelectStates.Not_Initialized:
             changed = SetState(SelectStates.Not_Initialized);
             if (changed)
                 Raise_ChildSelectStateChanged(changedMember);
             break;
     }
 }
 void memberInfo_HierarchyStateChanged(OlapMemberInfo sender)
 {
     Raise_HierarchyStateChanged(sender);    
 }
        public static BitmapImage GetIconImage(OlapMemberInfo memberInfo)
        {
            if (memberInfo == null)
                return null;

            BitmapImage res = null;

            switch (memberInfo.SelectState)
            {
                case SelectStates.Not_Initialized:
                case SelectStates.Not_Selected:
                    res = UriResources.Images.NotSelected16;
                    break;
                case SelectStates.Selected_Self:
                case SelectStates.Selected_By_Parent:
                    res = UriResources.Images.Selected16;
                    break;
                case SelectStates.Selected_With_Children:
                case SelectStates.Selected_By_Parent_With_Children:
                    res = UriResources.Images.SelectedChildren16;
                    break;
                case SelectStates.Labeled_As_Parent:
                    res = UriResources.Images.HasSelectedChildren16;
                    break;
                case SelectStates.Selected_With_Children_Has_Excluded:
                case SelectStates.Selected_By_Parent_With_Children_Has_Excluded:
                    res = UriResources.Images.HasExcludedChildren16;
                    break;
                default:
                    break;
            }

            return res;
        }
 void info_StateChanged(OlapMemberInfo sender)
 {
     UpdateNodeIcon();
 }
        /// <summary>
        /// Добавляет элемент в коллекцию дочерних OlapMemberInfo
        /// </summary>
        /// <param name="memberInfo"></param>
        public void AddChild(OlapMemberInfo memberInfo)
        {
            if (Root != null && Root is RootOlapMemberInfo)
            {
                ((RootOlapMemberInfo)Root).AllMembers[memberInfo.UniqueName] = memberInfo;
            }

            Children[memberInfo.UniqueName] = memberInfo;
            memberInfo.SetParentOlapMemberInfo(this);
        }
        /// <summary>
        /// Функция вызывается дочерним для родителя для сигнализации о том что како-либо дочерний OlapMemberInfo переведен в новое состояние
        /// </summary>
        /// <param name="changedMember">Элемент, который первым изменил состояние</param>
        private void ChildSelectStateChanged(OlapMemberInfo sender, OlapMemberInfo changedMember)
        {
            bool changed = false;

            switch (changedMember.SelectState)
            {
            case SelectStates.Selected_Self:
                if (SelectState == SelectStates.Selected_Self && AllChildrenIsSelected)
                {
                    SetNewState(SelectStates.Selected_With_Children);
                }
                else
                {
                    if (SelectState == SelectStates.Not_Initialized ||
                        SelectState == SelectStates.Not_Selected)
                    {
                        changed = SetState(SelectStates.Labeled_As_Parent);
                    }
                    if (changed)
                    {
                        Raise_ChildSelectStateChanged(changedMember);
                    }
                }
                break;

            case SelectStates.Not_Selected:
            case SelectStates.Not_Initialized:
                if (this.HasSelectedChildren == false)
                {
                    if (SelectState == SelectStates.Labeled_As_Parent)
                    {
                        changed = SetState(SelectStates.Not_Initialized);
                        Raise_SetChildrenState(SelectStates.Not_Initialized, false);

                        if (changed)
                        {
                            Raise_ChildSelectStateChanged(changedMember);
                        }
                        break;
                    }
                }

                if (HasSelectedChildren == false && AllChildrenIsLoaded == true)
                {
                    switch (SelectState)
                    {
                    case SelectStates.Selected_With_Children:
                    case SelectStates.Selected_With_Children_Has_Excluded:
                        changed = SetState(SelectStates.Selected_Self);
                        Raise_SetChildrenState(SelectStates.Not_Initialized, false);
                        break;

                    case SelectStates.Selected_By_Parent_With_Children:
                    case SelectStates.Selected_By_Parent_With_Children_Has_Excluded:
                        changed = SetState(SelectStates.Selected_By_Parent);
                        break;
                    }
                }
                else
                {
                    switch (SelectState)
                    {
                    case SelectStates.Selected_With_Children:
                        changed = SetState(SelectStates.Selected_With_Children_Has_Excluded);
                        break;

                    case SelectStates.Selected_By_Parent_With_Children:
                        changed = SetState(SelectStates.Selected_By_Parent_With_Children_Has_Excluded);
                        break;
                    }
                }
                if (changed)
                {
                    Raise_ChildSelectStateChanged(changedMember);
                }
                break;

            case SelectStates.Selected_With_Children:
                if (SelectState == SelectStates.Selected_Self && AllChildrenIsSelected)
                {
                    SetNewState(SelectStates.Selected_With_Children);
                }
                else
                {
                    if (SelectState == SelectStates.Not_Initialized ||
                        SelectState == SelectStates.Not_Selected)
                    {
                        changed = SetState(SelectStates.Labeled_As_Parent);
                    }
                    else
                    {
                        if (HasExcludedChildren == false)
                        {
                            if (SelectState == SelectStates.Selected_With_Children_Has_Excluded)
                            {
                                changed = SetState(SelectStates.Selected_With_Children);
                                Raise_ParentSelectStateChanged(this);
                            }
                            if (SelectState == SelectStates.Selected_By_Parent_With_Children_Has_Excluded)
                            {
                                changed = SetState(SelectStates.Selected_By_Parent_With_Children);
                            }
                        }
                    }
                    if (changed)
                    {
                        Raise_ChildSelectStateChanged(changedMember);
                    }
                }
                break;
            }
        }
 void OlapMemberInfoHierarchy_HierarchyStateChanged(OlapMemberInfo sender)
 {
     GenerateSetBySelectionState();
 }
 /// <summary>
 /// Генерирует событие - изменилось состояние всей иерархии элементов
 /// </summary>
 protected void Raise_HierarchyStateChanged(OlapMemberInfo sender)
 {
     StateChangedEventHandler handler = this.HierarchyStateChanged;
     if (handler != null)
     {
         handler(sender);
     }
 }
 void selectedNode_StateChanged(OlapMemberInfo sender)
 {
     InitSelectionStates();
 }
 /// <summary>
 /// Сообщает дочерним элементам об изменении состояния текущего элемента
 /// </summary>
 /// <param name="changedMember">элемент, который самым первым изменил свое состояние</param>
 private void Raise_ParentSelectStateChanged(OlapMemberInfo changedMember)
 {
     //Отправляем это событие дальше дочерним, передаем дальше элемент, который изначально инициировал событие
     if (Children != null)
     {
         foreach (OlapMemberInfo memberInfo in Children.Values)
         {
             memberInfo.ParentSelectStateChanged(this, changedMember);
         }
     }
 }
        /// <summary>
        /// Добавляет элемент в иерархию MemberNodeInfo
        /// </summary>
        /// <param name="member">Member, информация о котором должна быть добавлена в иерархию</param>
        public OlapMemberInfo AddMemberToHierarchy(MemberData info)
        {
            //Задача: Добавить OlapMemberInfo в иерархию 
            //Возможные варианты:
            //	- если элемент в иерархии уже есть, то выход
            //	- если элемента в иерархии еще нет, то ищем его родителя.
            //	  Если Родитель задан, Но родителя в иерархии тоже нет, то добавляем родителя и ищем дальше следующего родителя рекурсивно
            //	  Если родитель не задан, то элемент является корневым (одним из корневых) в иерархии	
            //Таким образом в иерархию добавляется не только элемент, но и полностью ветка его родителей (если ее не было)

            //Ищем информацию о данном члене измерения в загруженной иерархии
            OlapMemberInfo memberInfo = FindMember(info.UniqueName);

            //Если элемент в иерархии не найден, то его нужно добавить
            if (memberInfo == null)
            {
                //Создаем OlapMemberInfo
                memberInfo = new OlapMemberInfo(info);
                // Подписываемся у каждого добавленного элемента на событие - изменение состояния всей иерархии
                // данное событие генерит элемент, послуживший инициатором рекурсивного обновления состояний в дереве
                memberInfo.HierarchyStateChanged += new StateChangedEventHandler(memberInfo_HierarchyStateChanged);

                //OlapMemberInfo, который будем использовать для формирования ветки ....->Дед->Отец->Изначально добавляемый мембер
                //Ветку будем формировать при поиске родительских элементов
                OlapMemberInfo addedHierarchy = memberInfo;

                bool foundParentHierarchy = true;
                while (foundParentHierarchy)
                {
                    String parentUniqueName = String.Empty;
                    if (addedHierarchy.Info != null)
                    {
                        PropertyData prop = addedHierarchy.Info.GetMemberProperty(MemberData.PARENT_UNIQUE_NAME_PROPERTY);
                        if (prop != null && prop.Value != null)
                        {
                            parentUniqueName = prop.Value.ToString();
                        }
                    }

                    if (String.IsNullOrEmpty(parentUniqueName))
                    {
                        // В случае если например в мерархию загружены элементы уровня 1 и потом догружается элемент All, 
                        // то получится что в коллекции корневых элементов находятся элементы уровней 0 и 1. Чтобы такого не произошло
                        // после добавления просматриваем коллекцию корневых элементов и проверяем не является данный добавленный элемент родителем для кого-нибудь из уже имеющихся
                        // Если дочерние обнаружены, то они удаляются из корневых и добавляются в дочерние к данному элементу.

                        // Ищем среди корневых элементы дочерние для данного
                        Dictionary<String, OlapMemberInfo> toDelete = new Dictionary<string, OlapMemberInfo>();
                        foreach(var child in Children.Values)
                        {
                            String pun = String.Empty;
                            if (child.Info != null)
                            {
                                PropertyData prop = child.Info.GetMemberProperty(MemberData.PARENT_UNIQUE_NAME_PROPERTY);
                                if (prop != null && prop.Value != null)
                                {
                                    pun = prop.Value.ToString();
                                }
                            }
                            if (!String.IsNullOrEmpty(pun) && pun == addedHierarchy.UniqueName)
                            {
                                toDelete.Add(child.UniqueName, child);
                            }
                        }

                        // Удаляем из коллекции корневых дочерние элементы
                        foreach (var del in toDelete)
                        {
                            Children.Remove(del.Key);
                        }

                        // Добавляем в коллекцию корневых элементов
                        AddChild(addedHierarchy);

                        // Добавляем в дочерние те элементы, которые были до этого корневыми
                        foreach (var del in toDelete)
                        {
                            addedHierarchy.AddChild(del.Value);
                        }

                        foundParentHierarchy = false;
                        break;
                    }
                    else
                    {
                        OlapMemberInfo parentOlapMemberInfo = null;
                        parentOlapMemberInfo = FindMember(parentUniqueName);

                        //если родитель найден, то добавляем ему нашу сформированную ветку в дочерние
                        if (parentOlapMemberInfo != null)
                        {
                            parentOlapMemberInfo.AddChild(addedHierarchy);

                            foundParentHierarchy = false;
                            break;
                        }
                        else
                        {
                            //Добавляем в коллекцию корневых элементов
                            AddChild(addedHierarchy);
                            foundParentHierarchy = false;
                            break;
                            //throw new Exception(String.Format("Родитель для элемента {0} не найден в иерархии", info.Member.UniqueName));

                            ////Создаем OlapMemberInfo для родителя
                            //parentOlapMemberInfo = new OlapMemberInfo(addedHierarchy.Member.Parent, Mode, addedHierarchy.Member.Parent.ChildCount);
                            ////Добавляем ненайденного родителя в ветку, которую нужно добавить в иерархию
                            //parentOlapMemberInfo.AddChildOlapMemberInfo(addedHierarchy);

                            ////В этом случае мы иерархию строим руками и нужно явно добавлять в коллекцию memberInfoHierarchy.AllMembers
                            //memberInfoHierarchy.AllMembers[addedHierarchy.UniqueName] = addedHierarchy;

                            //addedHierarchy = parentOlapMemberInfo;

                        }
                    }
                }
            }

            return memberInfo;
        }
 /// <summary>
 /// Сообщает родительскому элементу об изменении состояния текущего элемента
 /// </summary>
 /// <param name="changedMember">элемент, который самым первым изменил свое состояние</param>
 private void Raise_ChildSelectStateChanged(OlapMemberInfo changedMember)
 {
     //Отправляем это событие родителю передаем дальше элемент, который изначально инициировал событие
     if (Parent != null)
     {
         Parent.ChildSelectStateChanged(this, changedMember);
     }
 }