//UWP-711 When the previous row index is DetailsViewIndex, the autoscroller will fails. Hence the below method is used to get previous row index. private int GetPreviousRow(int previousIndex, SfDataGrid dataGrid) { previousIndex = VisualContainer.ScrollRows.GetPreviousScrollLineIndex(previousIndex); while (dataGrid.IsInDetailsViewIndex(previousIndex)) { previousIndex = VisualContainer.ScrollRows.GetPreviousScrollLineIndex(previousIndex); } return(previousIndex); }
//UWP-711 When the next row index is DetailsViewIndex, the autoscroller will fails. Hence the below method is used to get next row index. private int GetNextRow(int currentIndex, SfDataGrid dataGrid) { currentIndex = VisualContainer.ScrollRows.GetNextScrollLineIndex(currentIndex); while (dataGrid.IsInDetailsViewIndex(currentIndex)) { currentIndex = VisualContainer.ScrollRows.GetNextScrollLineIndex(currentIndex); } return(currentIndex); }
/// <summary> /// Method used to get details viewdefinition index of the given DataGrid. /// </summary> /// <param name="dataGrid"> Specifies the data grid.</param> /// <param name="actualRowIdx">Specifies the integer type parameter.</param> /// <returns></returns> private int GetDetailsViewDefinitionIndex(SfDataGrid dataGrid, int actualRowIdx) { var counter0 = 0; for (int i = actualRowIdx; i > 0; i--) { if (!dataGrid.IsInDetailsViewIndex(i)) { break; } counter0++; } return(counter0); }
internal static int GetOrderForDetailsViewBasedOnIndex(this SfDataGrid dataGrid, int actualRowIdx) { // simply find the index which is not in DetailsView Index var counter0 = 0; for (int i = actualRowIdx; i > 0; i--) { if (!dataGrid.IsInDetailsViewIndex(i)) { break; } counter0++; } return(counter0); }
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 bool RaiseRowValidate(RowColumnIndex currentCellIndex) { if (IsCurrentRowValidated) { return(true); } #if WinRT || UNIVERSAL // In winrt and universal , the datagrid is from click notification. where we need to call parent validation to raise the cell validation for child grid. if (dataGrid is DetailsViewDataGrid) { var parentDataGrid = dataGrid.GetParentDataGrid(); if (parentDataGrid.SelectedDetailsViewGrid == null || (parentDataGrid.SelectedDetailsViewGrid != null && dataGrid != parentDataGrid.SelectedDetailsViewGrid)) { return(parentDataGrid.ValidationHelper.RaiseRowValidate(parentDataGrid.SelectionController.CurrentCellManager.CurrentRowColumnIndex)); } } #endif if (dataGrid.IsInDetailsViewIndex(currentCellIndex.RowIndex)) { if (dataGrid.SelectionController is GridBaseSelectionController) { var currentDetailsViewGrid = (dataGrid.SelectionController as GridBaseSelectionController).GetCurrentDetailsViewGrid(dataGrid); return(currentDetailsViewGrid.ValidationHelper.RaiseRowValidate(currentDetailsViewGrid.SelectionController.CurrentCellManager.CurrentRowColumnIndex)); } } var dataRow = dataGrid.RowGenerator.Items.FirstOrDefault(item => item.RowIndex == currentCellIndex.RowIndex); if (dataRow == null) { return(true); } errorMessages = new Dictionary <string, string>(); rowIndex = dataRow.RowIndex; var validatingArgs = new RowValidatingEventArgs(dataRow.WholeRowElement.DataContext, currentCellIndex.RowIndex, errorMessages, dataGrid); if (!dataGrid.RaiseRowValidatingEvent(validatingArgs)) { dataRow.VisibleColumns.ForEach (datacolbase => { if (datacolbase.GridColumn == null) { return; } if (datacolbase.ColumnElement == null) { return; } var currentCell = datacolbase.ColumnElement as GridCell; if (currentCell == null) { return; } if (validatingArgs.ErrorMessages.ContainsKey(datacolbase.GridColumn.MappingName)) { currentCell.SetRowValidationError(validatingArgs.ErrorMessages[datacolbase.GridColumn.MappingName]); } else { if (currentCell.HasError) { currentCell.RemoveRowValidationError(); } } }); dataRow.WholeRowElement.SetError(); if (!dataRow.IsEditing) { dataGrid.SelectionController.CurrentCellManager.BeginEdit(); } //WPF-31495 - Set CurrentCellVaildate only for isEditing datarow. if (dataRow.IsEditing) { SetCurrentCellValidated(false); } return(false); } else { RemoveError(dataRow, false); } var args = new RowValidatedEventArgs(validatingArgs.RowData, validatingArgs.RowIndex, validatingArgs.ErrorMessages, dataGrid); dataGrid.RaiseRowValidatedEvent(args); SetCurrentRowValidated(true); //this.dataGrid.VisualContainer.SuspendManipulationScroll = false; errorMessages = null; rowIndex = -1; return(true); }