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);
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
コード例 #2
0
        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);
                                }
                            }
                        }
                    }
                }
            }
        }