Exemple #1
0
        internal static bool[] GetHiddenPattern(this DetailsViewManager Manager)
        {
            var hiddenPattern = new List <bool> {
                false
            };

            Manager.DataGrid.DetailsViewDefinition.ForEach(r => hiddenPattern.Add(true));
            return(hiddenPattern.ToArray());
        }
Exemple #2
0
        /// <summary>
        /// Check whther any othe childview contains records
        /// </summary>
        /// <param name="record">RecordEntry</param>
        /// <returns>true if any child contains record</returns>
        internal static bool HasChildSource(this DetailsViewManager manager, RecordEntry record)
        {
            var provider = manager.DataGrid.View.GetPropertyAccessProvider();

            foreach (var definition in manager.DataGrid.DetailsViewDefinition)
            {
                var childSource = provider.GetValue(record.Data, definition.RelationalColumn) as IEnumerable;
                if (childSource != null && DetailsViewHelper.GetChildSourceCount(childSource) > 0)
                {
                    return(true);
                }
            }
            return(false);
        }
Exemple #3
0
        internal static Rect SubtractDetailsViewPadding(this DetailsViewManager manager, Rect cellRect)
        {
            var thickness = manager.DataGrid.DetailsViewPadding;

            if (cellRect.IsEmpty || cellRect.Width <= thickness.Left + thickness.Right || cellRect.Height <= thickness.Top + (2 * thickness.Bottom))
            {
                return(cellRect);
            }

            cellRect.Height -= (thickness.Bottom + thickness.Top);
            cellRect.Y      += thickness.Top;
            cellRect.Width  -= (thickness.Right + thickness.Left);
            cellRect.X      += thickness.Left;

            return(cellRect);
        }
Exemple #4
0
 /// <summary>
 /// Get GridViewDefinition with the specified index
 /// </summary>
 /// <param name="index">index</param>
 /// <returns>ViewDefinition</returns>
 internal static ViewDefinition GetGridViewDefinition(this DetailsViewManager manager, int index)
 {
     if (!(manager.DataGrid.DetailsViewDefinition.Count > index))
     {
         return(null);
     }
     // If the grid is DetailsViewDataGrid, need to get DetailsViewDefinition from Root DataGrid. Else get from main grid itself
     if (manager.DataGrid is DetailsViewDataGrid && manager.DataGrid.NotifyListener != null)
     {
         return(manager.DataGrid.NotifyListener.SourceDataGrid.DetailsViewDefinition[index]);
     }
     else
     {
         return(manager.DataGrid.DetailsViewDefinition[index]);
     }
 }
Exemple #5
0
        /// <summary>
        /// Get the level of particular DetailsViewDefinition
        /// </summary>
        /// <returns>Level</returns>
        internal static int GetDefinitionLevel(this DetailsViewManager manager, GridViewDefinition gridViewDefinition)
        {
            if (manager.DataGrid.DetailsViewDefinition == null || !manager.DataGrid.DetailsViewDefinition.Any())
            {
                return(0);
            }
            var hasDefintion = manager.DataGrid.DetailsViewDefinition.Contains(gridViewDefinition);

            if (hasDefintion)
            {
                return(1);
            }
            else
            {
                foreach (var defintion in manager.DataGrid.DetailsViewDefinition)
                {
                    return(1 + (defintion as GridViewDefinition).DataGrid.DetailsViewManager.GetDefinitionLevel(gridViewDefinition));
                }
            }
            return(0);
        }
Exemple #6
0
        /// <summary>
        /// Get the record in the specified row Index
        /// </summary>
        /// <param name="rowIndex">rowIndex</param>
        /// <returns>RecordEntry</returns>
        internal static RecordEntry GetDetailsViewRecord(this DetailsViewManager manager, int rowIndex)
        {
            RecordEntry record = null;

            if (manager.DataGrid.GridModel.HasGroup)
            {
                var recordIndex = manager.DataGrid.ResolveToGroupRecordIndexForDetailsView(rowIndex);
                if (recordIndex >= 0)
                {
                    record = manager.DataGrid.View.TopLevelGroup.DisplayElements[recordIndex] as RecordEntry;
                }
            }
            else
            {
                var recordIndex = manager.DataGrid.ResolveToRecordIndex(rowIndex);
                if (recordIndex >= 0)
                {
                    record = manager.DataGrid.View.Records[recordIndex];
                }
            }
            return(record);
        }
        private void ExpandAndSelectDetailsView(SfDataGrid dataGrid, int parentRowIndex, int childRowIndex, string relationalColumn)
        {
            //Checks whether the given index is parent row index or not.
            bool IsDetailsViewIndex = dataGrid.IsInDetailsViewIndex(parentRowIndex);

            if (IsDetailsViewIndex == true)
            {
                return;
            }
            //Gets the record of the parent row index.
            var record = dataGrid.View.Records[dataGrid.ResolveToRecordIndex(parentRowIndex)];
            //Gets the DetailsViewManager by using Reflection.
            var propertyInfo = dataGrid.GetType().GetField("DetailsViewManager", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic);
            DetailsViewManager detailsViewManager = propertyInfo.GetValue(dataGrid) as DetailsViewManager;
            // Checks whether the parent record has the child grid or not by getting the child source and its count.
            var childSource         = detailsViewManager.GetChildSource(record.Data, relationalColumn);
            var GetChildSourceCount = detailsViewManager.GetType().GetMethod("GetChildSourceCount", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Static);
            var ChildSourceCount    = GetChildSourceCount.Invoke(detailsViewManager, new object[] { childSource });

            if ((int)ChildSourceCount == 0)
            {
                return;
            }

            //Checks whether the record is Expanded or Collapsed.
            //When it is in the collapsed state, you need to expand the particular DetailsView based on the index.
            if (!record.IsExpanded)
            {
                dataGrid.ExpandDetailsViewAt(dataGrid.ResolveToRecordIndex(parentRowIndex));
            }
            //Gets the index of the DetailsView.
            int index = 0;

            foreach (var def in dataGrid.DetailsViewDefinition)
            {
                if (def.RelationalColumn == relationalColumn)
                {
                    index = dataGrid.DetailsViewDefinition.IndexOf(def);
                    index = parentRowIndex + index + 1;
                }
            }
            //Brings the parent row in the view.
            var rowcolumnIndex = new RowColumnIndex(index, 1);

            dataGrid.ScrollInView(rowcolumnIndex);
            //Gets the DetailsViewDataGrid by passing the corresponding rowindex and relation name.
            var detailsViewDataGrid = dataGrid.GetDetailsViewGrid(dataGrid.ResolveToRecordIndex(parentRowIndex), relationalColumn);
            //Checks whether the given index is currently in view or not.
            //When the specified index is not currently in view, you can bring that row in to the view by using the SfDataGrid.ScrollInView method.
            var firstline = dataGrid.GetVisualContainer().ScrollRows.GetVisibleLines().FirstOrDefault(line => line.Region == ScrollAxisRegion.Body);
            var lastline  = dataGrid.GetVisualContainer().ScrollRows.GetVisibleLines().LastOrDefault(line => line.Region == ScrollAxisRegion.Body);

            if (firstline.LineIndex >= index || lastline.LineIndex <= index)
            {
                //Brings the details view grid in to the view and sets the child grid's SelectedIndex as the ChildRowIndex.
                if (record != null && record.IsExpanded)
                {
                    if (detailsViewDataGrid == null)
                    {
                        detailsViewManager.BringIntoView(index);
                        detailsViewDataGrid = dataGrid.GetDetailsViewGrid(dataGrid.ResolveToRecordIndex(parentRowIndex), relationalColumn);
                    }
                }
            }

            if (detailsViewDataGrid != null)
            {
                detailsViewDataGrid.SelectedIndex = childRowIndex;
            }
        }
        internal override void EnsureColumns(VisibleLinesCollection visibleColumnLines)
        {
            this.VisibleColumns.ForEach(dataColumn => dataColumn.IsEnsured = false);
            var groupCount = this.DataGrid.View != null ? this.DataGrid.View.GroupDescriptions.Count : 0;
            int startIndex = 0;

            if (this.DataGrid.showRowHeader)
            {
                if (visibleColumnLines.Any(line => line.LineIndex == 0))
                {
                    var dc = this.VisibleColumns.FirstOrDefault(dataColumn => dataColumn.ColumnIndex == 0);
                    if (dc != null)
                    {
                        dc.IsEnsured = true;
                        if (dc.ColumnVisibility == Visibility.Collapsed)
                        {
                            dc.ColumnVisibility = Visibility.Visible;
                        }
                    }
                    else
                    {
                        CreateRowHeaderColumn(startIndex);
                    }
                }
                startIndex++;
            }
            for (var index = startIndex; index < groupCount + startIndex; index++)
            {
                if (visibleColumnLines.Any(line => line.LineIndex == index))
                {
                    var dc = this.VisibleColumns.FirstOrDefault(dataColumn => dataColumn.ColumnIndex == index);
                    if (dc != null)
                    {
                        dc.IsEnsured = true;
                        if (dc.ColumnVisibility == Visibility.Collapsed)
                        {
                            dc.ColumnVisibility = Visibility.Visible;
                        }
                    }
                    else
                    {
                        this.VisibleColumns.Add(CreateIndentColumn(index));
                    }
                }
            }

            var indentcolumnindex = groupCount + (this.DataGrid.showRowHeader ? 1 : 0);

            if (visibleColumnLines.Any(line => line.LineIndex == indentcolumnindex))
            {
                var indentDataColumn = this.VisibleColumns.FirstOrDefault(dataColumn => dataColumn.ColumnIndex == indentcolumnindex);
                if (indentDataColumn != null)
                {
                    indentDataColumn.IsEnsured = true;
                    if (indentDataColumn.ColumnVisibility == Visibility.Collapsed)
                    {
                        indentDataColumn.ColumnVisibility = Visibility.Visible;
                    }
                }
                else
                {
                    this.VisibleColumns.Add(CreateDetailsViewIndentColumn(groupCount + (this.DataGrid.showRowHeader ? 1 : 0)));
                }
            }

            var detailsViewDataColumn = this.VisibleColumns.FirstOrDefault(dataColumn => dataColumn.ColumnIndex == groupCount + 1 + (this.DataGrid.showRowHeader ? 1 : 0));

            if (detailsViewDataColumn != null)
            {
                detailsViewDataColumn.IsEnsured = true;
                if (detailsViewDataColumn.ColumnVisibility == Visibility.Collapsed)
                {
                    detailsViewDataColumn.ColumnVisibility = Visibility.Visible;
                }
            }
            else
            {
                this.VisibleColumns.Add(CreateDetailsViewContent(groupCount + 1 + (this.DataGrid.showRowHeader ? 1 : 0)));
            }
            this.VisibleColumns.ForEach(column =>
            {
                if (!column.IsEnsured)
                {
                    CollapseColumn(column);
                }
            });
            // WPF-18333 - after clearing all the columns, DetailsViewContentPresenter content will be null. Then if new column is added, its content need to be set here.
            // Also parent grid width should be adjuted based on DetailsViewDataGrid
            if (this.DetailsViewContentPresenter != null && this.DetailsViewContentPresenter.Content == null)
            {
                this.DetailsViewContentPresenter.Content = this.DetailsViewDataGrid;
                if (this.DetailsViewDataGrid.NotifyListener != null)
                {
                    DetailsViewManager.AdjustParentsWidth(this.DetailsViewDataGrid.NotifyListener.GetParentDataGrid(), this.DetailsViewDataGrid);
                }
            }

            if (this.WholeRowElement.ItemsPanel != null)
            {
                this.WholeRowElement.ItemsPanel.InvalidateMeasure();
            }
        }