public void InitializeColumnsArea(PivotLayoutProvider layout) { foreach (MemberControl ctrl in m_ColumnsMembers) { ItemsLayoutRoot.Children.Remove(ctrl); } m_ColumnsMembers.Clear(); for (int c = 0; c < m_ColumnsArea_Splitters.Columns_Size; c++) for (int r = 0; r < m_ColumnsArea_Splitters.Rows_Size; r++) { var splitter = m_ColumnsArea_Splitters[c, r]; if (splitter != null) { ItemsLayoutRoot.Children.Remove(splitter); } } m_ColumnsArea_Splitters = new Cache2D<GridSplitter>(); ColumnsArea_LovestMemberControls.Clear(); // Получаем сортировку по значению для противоположной оси SortByValueDescriptor value_sort = null; if (QueryManager != null) { value_sort = (AxisIsRotated == false ? QueryManager.Axis1_MeasuresSort : QueryManager.Axis0_MeasuresSort) as SortByValueDescriptor; } int start_ColumnIndex = CellsArea_BeginColumnIndex; for (int column_indx = 0, layout_column_indx = start_ColumnIndex; layout_column_indx < ItemsLayoutRoot.ColumnDefinitions.Count; column_indx++, layout_column_indx++) { ColumnDefinition col = ItemsLayoutRoot.ColumnDefinitions[layout_column_indx]; if (col == m_Fictive_Column) continue; for (int row_indx = 0; row_indx < layout.ColumnsLayout.Rows_Size; row_indx++) { // !!! LayoutCellWrapper cell_wrapper = layout.ColumnsLayout[ColumnsArea_FirstVisible_Coordinate.Column + column_indx, ColumnsArea_FirstVisible_Coordinate.Row + row_indx]; if (cell_wrapper != null) { foreach (LayoutItem item in cell_wrapper.Items) { MemberControl member_Control = null; MemberLayoutItem member_item = item as MemberLayoutItem; if (member_item != null && (member_item.IsExtension == false || (member_item.IsExtension == true && column_indx == 0))) { if (m_MemberControls_Dict.ContainsKey(member_item.PivotMember.Member)) { member_Control = m_MemberControls_Dict[member_item.PivotMember.Member]; } if (member_Control == null) { member_Control = new ColumnMemberControl(this, member_item.PivotMember.Member, member_item.PivotMember.PivotDrillDepth); m_MemberControls_Dict.Add(member_item.PivotMember.Member, member_Control); // Подписываемся на Drill-операцию member_Control.ExecuteMemberAction += new MemberActionEventHandler(OnExecuteMemberAction); // Подписываемся на операцию по умолчанию } if (CellsArea_BeginRowIndex > 0 && row_indx == CellsArea_BeginRowIndex - 1) { if (member_item.IsExtension == false) { ColumnsArea_LovestMemberControls.Add(member_Control); // Определяем сортирована ли данная колонка if (value_sort != null && value_sort.Type != SortTypes.None) { // Сортирована ли по данному элементу if (value_sort.CompareByTuple(member_item.PivotMember.Member.GetAxisTuple())) { member_Control.SortByValueType = value_sort.Type; } } //if (m_Vertiacal_Splitters.ContainsKey(layout_column_indx)) //{ // m_Vertiacal_Splitters[layout_column_indx].Tag = member_Control; // //Canvas.SetZIndex(m_Vertiacal_Splitters[layout_column_indx], 10); //} } } m_ColumnsMembers.Add(member_Control); ItemsLayoutRoot.Children.Add(member_Control); Grid.SetColumn(member_Control, layout_column_indx); Grid.SetColumnSpan(member_Control, member_item.ColumnSpan); Grid.SetRow(member_Control, row_indx); Grid.SetRowSpan(member_Control, member_item.RowSpan); if (member_item.PivotMember.IsFirstDrillDownChild || (column_indx == 0/* && member_item.IsExtension == false*/)) { member_Control.ShowLeftBorder = true; } else { member_Control.ShowLeftBorder = false; } if (row_indx == 0 || member_item.PivotMember.PivotDrillDepth > 0) { member_Control.ShowUpBorder = true; } else { member_Control.ShowUpBorder = false; } // Если элемент размером на несколько строк, то сплиттер добавляем на последнюю строку int cells_area_index = column_indx + (member_item.ColumnSpan > 1 ? (member_item.ColumnSpan - 1) : 0); var splitter = Add_VertSplitter(ItemsLayoutRoot, ColumnsArea_BeginColumnIndex + cells_area_index, row_indx, 1); splitter.Margin = new Thickness(0, member_Control.Margin.Top, 0, 0); m_ColumnsArea_Splitters.Add(splitter, cells_area_index, row_indx); // Чтобы сплиттер для элемента не накладывался на DrillDown родителя if (column_indx > 0) { // Верхнее смещение сплиттера должно быть как смещение следующего за сплиттером контрола var prev_member_splitter = m_ColumnsArea_Splitters[column_indx - 1, row_indx]; if (prev_member_splitter != null) { prev_member_splitter.Margin = new Thickness(0, member_Control.Margin.Top, 0, 0); } else { // Если сплиттер на предыдущей строке разметки не найден, то добавим его prev_member_splitter = Add_VertSplitter(ItemsLayoutRoot, ColumnsArea_BeginColumnIndex + column_indx - 1, row_indx, 1); prev_member_splitter.Margin = new Thickness(0, member_Control.Margin.Top, 0, 0); m_ColumnsArea_Splitters.Add(prev_member_splitter, column_indx - 1, row_indx); } } } } } } } }
public void InitializeColumnsArea(PivotLayoutProvider layout) { foreach (MemberControl ctrl in m_ColumnsMembers) { ItemsLayoutRoot.Children.Remove(ctrl); } m_ColumnsMembers.Clear(); ColumnsArea_LovestMemberControls.Clear(); int start_ColumnIndex = CellsArea_BeginColumnIndex; for (int column_indx = 0, layout_column_indx = start_ColumnIndex; layout_column_indx < ItemsLayoutRoot.ColumnDefinitions.Count; column_indx++, layout_column_indx++) { ColumnDefinition col = ItemsLayoutRoot.ColumnDefinitions[layout_column_indx]; if (col == m_Fictive_Column) continue; for (int row_indx = 0; row_indx < layout.ColumnsLayout.Rows_Size; row_indx++) { // !!! LayoutCellWrapper cell_wrapper = layout.ColumnsLayout[ColumnsArea_FirstVisible_Coordinate.Column + column_indx, ColumnsArea_FirstVisible_Coordinate.Row + row_indx]; if (cell_wrapper != null) { foreach (LayoutItem item in cell_wrapper.Items) { MemberControl member_Control = null; MemberLayoutItem member_item = item as MemberLayoutItem; if (member_item != null && (member_item.IsExtension == false || (member_item.IsExtension == true && column_indx == 0))) { if (m_MemberControls_Dict.ContainsKey(member_item.PivotMember.Member)) { member_Control = m_MemberControls_Dict[member_item.PivotMember.Member]; } if (member_Control == null) { member_Control = new ColumnMemberControl(this, member_item.PivotMember.Member, member_item.PivotMember.PivotDrillDepth); m_MemberControls_Dict.Add(member_item.PivotMember.Member, member_Control); // Подписываемся на Drill-операцию member_Control.DrillDownMember += new MemberActionEventHandler(OnDrillDownMember); } if (CellsArea_BeginRowIndex > 0 && row_indx == CellsArea_BeginRowIndex - 1) { if (member_item.IsExtension == false) { ColumnsArea_LovestMemberControls.Add(member_Control); if (m_Vertiacal_Splitters.ContainsKey(layout_column_indx)) { m_Vertiacal_Splitters[layout_column_indx].Tag = member_Control; //Canvas.SetZIndex(m_Vertiacal_Splitters[layout_column_indx], 10); } } } m_ColumnsMembers.Add(member_Control); ItemsLayoutRoot.Children.Add(member_Control); Grid.SetColumn(member_Control, layout_column_indx); Grid.SetColumnSpan(member_Control, member_item.ColumnSpan); Grid.SetRow(member_Control, row_indx); Grid.SetRowSpan(member_Control, member_item.RowSpan); if (member_item.PivotMember.IsFirstDrillDownChild || (column_indx == 0/* && member_item.IsExtension == false*/)) { member_Control.ShowLeftBorder(true); } else { member_Control.ShowLeftBorder(false); } if (row_indx == 0 || member_item.PivotMember.PivotDrillDepth > 0) { member_Control.ShowUpBorder(true); } else { member_Control.ShowUpBorder(false); } } } } } } }