internal static bool[] GetHiddenPattern(this DetailsViewManager Manager) { var hiddenPattern = new List <bool> { false }; Manager.DataGrid.DetailsViewDefinition.ForEach(r => hiddenPattern.Add(true)); return(hiddenPattern.ToArray()); }
/// <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); }
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); }
/// <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]); } }
/// <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); }
/// <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(); } }