void InitSelectionStates() { if (tabControl != null && mdxSetTab != null && tabControl.TabCtrl.SelectedItem == mdxSetTab) { selectedList.Items.Clear(); m_Selected_Count.Text = "0"; GenerateSetBySelectionState(); mdxSetTextBox.Text = SelectedSet; foreach (OlapMemberInfo info in MembersInSet.Values) { MemberTreeNode node = null; node = new MemberTreeNode(info, MultiSelect); node.MemberVisualizationType = MemberVisualizationType; info.StateChanged += new OlapMemberInfo.StateChangedEventHandler(selectedNode_StateChanged); node.Expanded += new RoutedEventHandler(selectedNode_DblClick); node.Collapsed += new RoutedEventHandler(selectedNode_DblClick); selectedList.Items.Add(node); } m_Selected_Count.Text = MembersInSet.Values.Count.ToString(); } }
void ChangeCurrentMember(MemberTreeNode node) { if (node != null) { m_CurrentMember = node.MemberInfo.Info; } else { m_CurrentMember = null; } }
void FindMembers_InvokeCommandCompleted(DataLoaderEventArgs e, MemberTreeNode node_) { findResultTree.Items.Clear(); m_Find_Count.Text = "0"; if (e.Result.ContentType == InvokeContentType.Error) { findResultTree.IsError = true; return; } List<MemberData> members = new List<MemberData>(); if (!String.IsNullOrEmpty(e.Result.Content)) { CellSetData cellSet = CellSetData.Deserialize(e.Result.Content); members = QueryProvider.GetMembers(cellSet); } //ClearTree(); // CreateChildNodes(null, members); List<OlapMemberInfo> infos = new List<OlapMemberInfo>(); foreach (MemberData wrapper in members) { // Каждый из элементов помещаем в иерархию OlapMemberInfo info = OlapMemberInfoHierarchy.AddMemberToHierarchy(wrapper); if (info != null) { infos.Add(info); } } foreach (OlapMemberInfo info in infos) { MemberTreeNode node = null; node = new MemberTreeNode(info, MultiSelect); node.MemberVisualizationType = MemberVisualizationType; node.Expanded += new RoutedEventHandler(findedNode_DblClick); node.Collapsed += new RoutedEventHandler(findedNode_DblClick); findResultTree.Items.Add(node); } m_Find_Count.Text = infos.Count.ToString(); }
void GetAscendants_InvokeCommandCompleted(DataLoaderEventArgs e) { if (e.Result.ContentType == InvokeContentType.Error) { ClearTree(); membersTree.IsError = true; return; } List<MemberData> members = new List<MemberData>(); if (!String.IsNullOrEmpty(e.Result.Content)) { CellSetData cellSet = CellSetData.Deserialize(e.Result.Content); members = QueryProvider.GetMembers(cellSet); } List<OlapMemberInfo> infos = new List<OlapMemberInfo>(); foreach (MemberData member in members) { // Каждый из элементов помещаем в иерархию OlapMemberInfo info = OlapMemberInfoHierarchy.AddMemberToHierarchy(member); if (info != null) { infos.Add(info); } } foreach (OlapMemberInfo info in infos) { MemberTreeNode node = null; //Если родительский узел не задан, то узел добавится в корень if (m_TreeNodes.ContainsKey(info.UniqueName)) { node = m_TreeNodes[info.UniqueName]; } if (node == null) { node = new MemberTreeNode(info, MultiSelect); node.MemberVisualizationType = MemberVisualizationType; node.IsPreloaded = true; node.Special_MouseDoubleClick += new EventHandler<CustomEventArgs<CustomTreeNode>>(node_SpecialNodeExpanded); node.Expanded += new RoutedEventHandler(MemberNode_Expanded); //Если есть дочерние, то добавляем фиктивный узел для отображения [+] напротив данного узла if (!node.IsExpanded /*&& !node.IsReloadAll*/ && info.HasChildren) { if (node.Items.Count == 0) node.IsWaiting = true; } //node.Expanded += new RoutedEventHandler(FindMemberNode_Expanded); m_TreeNodes[info.UniqueName] = node; MemberTreeNode parent = null; String parentUniqueName = String.Empty; if (info.Info != null) { PropertyData prop = info.Info.GetMemberProperty(MemberData.PARENT_UNIQUE_NAME_PROPERTY); if (prop != null && prop.Value != null) { parentUniqueName = prop.Value.ToString(); } } if (!String.IsNullOrEmpty(parentUniqueName)) { //Если родительский узел не задан, то узел добавится в корень if (m_TreeNodes.ContainsKey(parentUniqueName)) { parent = m_TreeNodes[parentUniqueName]; } } if (parent == null) { membersTree.IsFullLoaded = false; membersTree.Items.Add(node); membersTree.IsWaiting = false; //membersTree.IsReloadAll = true; } else { if (parent.Items.Count < parent.MemberInfo.CubeChildrenCount) parent.IsFullLoaded = false; parent.Items.Add(node); parent.IsWaiting = false; parent.IsExpanded = true; //parent.IsReloadAll = true; } } } MemberTreeNode memberNode = null; if (infos.Count > 0 && m_TreeNodes.ContainsKey(infos[infos.Count -1].UniqueName)) { memberNode = m_TreeNodes[infos[infos.Count - 1].UniqueName]; } if (memberNode != null) { // Если узел в дереве найден, то нужно просто переключиться на него SelectNode(memberNode); tabControl.TabCtrl.SelectedItem = membersTab; } //membersList.Initialize(infos); ////Получаем все родительские элементы для указанного //List<MemberDataWrapper> dict = GetAscendants(uniqueName); //if (dict != null && dict.Count > 0) //{ // bool allParentIsLoaded = true; // TreeListNode parentNode = null; // //Каждый из предков и сам узел в дерево // foreach (MemberDataWrapper de in dict) // { // TreeListNode node = PreloadChildrenNodes(parentNode, de); // if (node == null) // { // allParentIsLoaded = false; // break; // } // parentNode = node; // } // //Если процесс дозагрузки дочерних для всех родителей прошел успешно // if (allParentIsLoaded && parentNode != null) // { // Tree.SetFocusedNode(parentNode); // TabControl.SelectedTabPageIndex = 0; // //Устанавливаем фокус на дерево // Tree.Focus(); // } //} }
/// <summary> /// Загружает <paramref name="count"/> дочерних элементов для элемента с указанным <paramref name="uniqueName"/>, начиная c <paramref name="begin"/>. /// </summary> /// <param name="begin">индекс начала</param> /// <param name="count">количество</param> private void LoadChildren(MemberTreeNode item, long begin, long count) { if (item == null) return; OlapMemberInfo info = item.MemberInfo; //MemberChoiceQuery args = CommandHelper.CreateGetChildrenMembersQueryArgs(Connection, CubeName, SubCube, HierarchyUniqueName, info.UniqueName, CurrentLevelUniqueName, begin, count); //OlapDataLoader.LoadData(args, new UserSchemaWrapper<MemberChoiceQuery, MemberTreeNode>(args, item)); // Грузим Step+1 элемент, а отображать будем только Step штук. Если в ответе придет Step+1 элемент, то значит нужно отображать узел LoadNext if (count != -1) count += 1; String query = DataManager.GetChildrenMembers(info.UniqueName, begin, count); LogManager.LogInformation(this, this.Name + " - Loading children for '" + info.UniqueName + "'"); MdxQueryArgs query_args = CommandHelper.CreateMdxQueryArgs(Connection, query); OlapDataLoader.LoadData(query_args, new UserSchemaWrapper<MemberChoiceQueryType, MemberTreeNode>(MemberChoiceQueryType.GetChildrenMembers, item)); }
void Service_GetChildrenMembersCompleted(DataLoaderEventArgs e, MemberTreeNode parentNode) { if (e.Result.ContentType == InvokeContentType.Error) { ClearTree(); membersTree.IsError = true; return; } List<MemberData> members = new List<MemberData>(); if (!String.IsNullOrEmpty(e.Result.Content)) { CellSetData cellSet = CellSetData.Deserialize(e.Result.Content); members = QueryProvider.GetMembers(cellSet); } CreateChildNodes(parentNode, members); }
/// <summary> /// Загружает все дочерние элементы для указанного /// </summary> private void LoadChildren(MemberTreeNode item) { LoadChildren(item, -1, -1); }
/// <summary> /// Раскрытие узла дерева /// </summary> /// <param name="node"></param> private void BeforeExpandNode(MemberTreeNode node) { node.Items.Clear(); node.IsWaiting = true; //Загружаем дочерние элементы для данного узла if (useStepLoading) { LoadChildren(node, 0, Step); } else { LoadChildren(node); } }
void CreateChildNodes(MemberTreeNode parent, List<MemberData> members) { if (members == null || members.Count == 0) return; List<OlapMemberInfo> infos = new List<OlapMemberInfo>(); List<OlapMemberInfo> to_Collapse = new List<OlapMemberInfo>(); for (int i = 0; i < members.Count; i++) { MemberData wrapper = members[i]; // Грузим Step+1 элемент, а отображать будем только Step штук. Если в ответе придет Step+1 элемент, то значит нужно отображать узел LoadNext if (UseStepLoading && members.Count > Step && i >= (members.Count - 1)) break; // Каждый из элементов помещаем в иерархию OlapMemberInfo info = OlapMemberInfoHierarchy.AddMemberToHierarchy(wrapper); if (info != null) { long realCount = QueryProvider.GetRealChildrenCount(wrapper); if (info.CubeChildrenCount != realCount) { to_Collapse.Add(info); info.CubeChildrenCount = realCount; } infos.Add(info); } } //Если известен родительский узел дерева. То получаем его OlapMemberInfo if (parent != null) { parent.IsWaiting = false; } // Вычисляем индекс служебного узла "Загрузить далее..." int loadNextIndex = -1; if (parent == null) { for (int i = membersTree.Items.Count - 1; i >= 0; i--) { LoadNextTreeNode loadNext = membersTree.Items[i] as LoadNextTreeNode; if (loadNext != null) { loadNextIndex = i; break; } } } else { for (int i = parent.Items.Count - 1; i >= 0; i--) { LoadNextTreeNode loadNext = parent.Items[i] as LoadNextTreeNode; if (loadNext != null) { loadNextIndex = i; break; } } } int indx = 0; foreach (OlapMemberInfo info in infos) { MemberTreeNode node = null; //Если родительский узел не задан, то узел добавится в корень if (m_TreeNodes.ContainsKey(info.UniqueName)) { node = m_TreeNodes[info.UniqueName]; if (to_Collapse.Contains(info)) { //Сворачиваем узел, чтобы при разворачивании зачиталось новое количество дочерних if (node != null) { node.IsExpanded = false; //Удаляем дочерние узлы дерева node.Items.Clear(); // Обновляем информацию о количестве дочерних node.MemberInfo.CubeChildrenCount = info.CubeChildrenCount; } } } if (node == null) { // Создание нового узла для добавления в дерево node = new MemberTreeNode(info, MultiSelect); node.MemberVisualizationType = MemberVisualizationType; node.Special_MouseDoubleClick += new EventHandler<CustomEventArgs<CustomTreeNode>>(node_SpecialNodeExpanded); node.Expanded += new RoutedEventHandler(MemberNode_Expanded); m_TreeNodes[info.UniqueName] = node; // Если узла "Загрузить далее..." не найдено то узел добавляем в конец списка // В противном случае вставляем узел перед узлом "Загрузить далее..." if (loadNextIndex == -1) { if (parent == null) membersTree.Items.Add(node); else parent.Items.Add(node); } else { if (parent == null) membersTree.Items.Insert(loadNextIndex + indx, node); else parent.Items.Insert(loadNextIndex + indx, node); } } else { // т.к. узел уже был создан ранее, то это означает что элемент был загружен в дерево во внеочередном порядке (т.к. находится после узла "Загрузить далее...") // такое возможно при попытке загрузить родителей для элемента при переключении по двойному клику с закладки с результатами поиска // В этом случе узел нужно удалить из списка и вставить перед узлом "Загрузить далее..." if (loadNextIndex != -1) { if (parent == null) { membersTree.Items.Remove(node); membersTree.Items.Insert(loadNextIndex + indx, node); node.IsPreloaded = false; } else { parent.Items.Remove(node); parent.Items.Insert(loadNextIndex + indx, node); node.IsPreloaded = false; } } } //Если нужно выводить элемнты ТОЛЬКО верхнего уровня if (ShowOnlyFirstLevelMembers == false) { //Если есть дочерние, то добавляем фиктивный узел для отображения [+] напротив данного узла if (!node.IsExpanded && info.HasChildren) { if (node.Items.Count == 0) node.IsWaiting = true; } } indx++; } //Если режим Частичной загрузки, то сверяем количество загруженных элементов и количество элементов в кубе if (useStepLoading) { // Грузим Step+1 элемент, а отображать будем только Step штук. Если в ответе придет Step+1 элемент, то значит нужно отображать узел LoadNext if (members.Count > Step) { if (loadNextIndex == -1) { if (parent != null) parent.IsFullLoaded = false; else { membersTree.IsFullLoaded = false; } } } else { if (parent != null) parent.IsFullLoaded = true; else { membersTree.IsFullLoaded = true; } } } else { if (parent != null) parent.IsFullLoaded = true; else { membersTree.IsFullLoaded = true; } } membersTree.UpdateLayout(); }
void service_GetRootMembersCompleted(DataLoaderEventArgs e, MemberTreeNode parentNode) { membersTree.IsWaiting = false; membersTree.IsFullLoaded = true; if (e.Result.ContentType == InvokeContentType.Error) { ClearTree(); membersTree.IsError = true; SetFilterBuilderToError(); return; } List<MemberData> members = new List<MemberData>(); if (!String.IsNullOrEmpty(e.Result.Content)) { CellSetData cellSet = CellSetData.Deserialize(e.Result.Content); members = QueryProvider.GetMembers(cellSet); } CreateChildNodes(null, members); // ClearCustomSelection(); if (membersTree.Items.Count > 0) { MemberTreeNode node = membersTree.Items[0] as MemberTreeNode; SelectNode(node); } if (!m_LevelPropertiesIsLoaded) LoadLevelProperties(); }
void SelectNode(MemberTreeNode node) { ClearCustomSelection(); if (node != null) { node.IsSelected = true; if (!m_CustomSelection.Contains(node)) m_CustomSelection.Add(node); } }