public void Paste() { // parse the clipboard data List <string[]> rowData = ClipboardHelper.ParseClipboardData(); if (rowData != null) { bool hasAddedNewRow = false; // call OnPastingCellClipboardContent for each cell int minRowIndex = Items.IndexOf(CurrentItem); int maxRowIndex = Items.Count - 1; int minColumnDisplayIndex = 0; int maxColumnDisplayIndex = Columns.Count - 1; int rowDataIndex = 0; for (int i = minRowIndex; i <= maxRowIndex && rowDataIndex < rowData.Count; i++, rowDataIndex++) { CurrentItem = Items[i]; BeginEditCommand.Execute(null, this); int columnDataIndex = 0; for (int j = minColumnDisplayIndex; j <= maxColumnDisplayIndex && columnDataIndex < rowData[rowDataIndex].Length; j++, columnDataIndex++) { DataGridColumn column = ColumnFromDisplayIndex(j); column.OnPastingCellClipboardContent(Items[i], rowData[rowDataIndex][columnDataIndex]); } CommitEditCommand.Execute(this, this); if (i == maxRowIndex) { maxRowIndex++; hasAddedNewRow = true; } } // update selection if (hasAddedNewRow) { UnselectAll(); UnselectAllCells(); CurrentItem = Items[minRowIndex]; if (SelectionUnit == DataGridSelectionUnit.FullRow) { SelectedItem = Items[minRowIndex]; } else if (SelectionUnit == DataGridSelectionUnit.CellOrRowHeader || SelectionUnit == DataGridSelectionUnit.Cell) { SelectedCells.Add(new DataGridCellInfo(Items[minRowIndex], Columns[minColumnDisplayIndex])); } } } }
/// <summary> /// This virtual method is called when ApplicationCommands.Paste command is executed. /// </summary> /// <param name="args"></param> protected virtual void OnExecutedPaste(ExecutedRoutedEventArgs args) { if (CanClipboardPaste == false) { return; } // Parse the clipboard data List <string[]> data = ClipboardHelper.ParseClipboardData(); if (data == null) { return; } UnselectAll(); UnselectAllCells(); // Call OnPastingCellClipboardContent for each cell int minDispRow = Items.IndexOf(CurrentItem); int maxDispRow = Items.Count; int minDispCol = Columns.IndexOf(CurrentColumn); int maxDispCol = Columns.Count; int dispRow, dispCol, dataRow, dataCol; for (dispRow = minDispRow, dataRow = 0; dataRow < data.Count; dispRow++, dataRow++) { if (dispRow >= maxDispRow) { var itemsSourceList = ItemsSource as IList; var addValue = Activator.CreateInstance(Items[0].GetType()); maxDispRow++; itemsSourceList.Add(addValue); } BeginEditCommand.Execute(null, this); for (dispCol = minDispCol, dataCol = 0; dispCol < maxDispCol && dataCol < data[dataRow].Length; dispCol++, dataCol++) { DataGridColumn column = ColumnFromDisplayIndex(dispCol); column.OnPastingCellClipboardContent(Items[dispRow], data[dataRow][dataCol]); if (SelectionUnit == DataGridSelectionUnit.CellOrRowHeader || SelectionUnit == DataGridSelectionUnit.Cell) { SelectedCells.Add(new DataGridCellInfo(Items[dispRow], Columns[dispCol])); } } if (SelectionUnit == DataGridSelectionUnit.FullRow) { SelectedItems.Add(Items[dispRow]); } CommitEditCommand.Execute(this, this); } }
/// <summary> /// This virtual method is called when ApplicationCommands.Paste command is executed. /// </summary> /// <param name="target"></param> /// <param name="args"></param> protected virtual void OnExecutedPaste(object target, ExecutedRoutedEventArgs args) { if (ExecutePasteEvent != null) { ExecutePasteEvent(target, args); if (args.Handled) { return; } } // parse the clipboard data List <string[]> rowData = ClipboardHelper.ParseClipboardData(); bool hasAddedNewRow = false; // call OnPastingCellClipboardContent for each cell int minRowIndex = Items.IndexOf(CurrentItem); int maxRowIndex = Items.Count - 1; int minColumnDisplayIndex = (SelectionUnit != DataGridSelectionUnit.FullRow) ? Columns.IndexOf(CurrentColumn) : 0; int maxColumnDisplayIndex = Columns.Count - 1; int rowDataIndex = 0; for (int i = minRowIndex; i <= maxRowIndex && rowDataIndex < rowData.Count; i++, rowDataIndex++) { if (i < Items.Count) { CurrentItem = Items[i]; BeginEditCommand.Execute(null, this); int columnDataIndex = 0; for (int j = minColumnDisplayIndex; j <= maxColumnDisplayIndex && columnDataIndex < rowData[rowDataIndex].Length; j++, columnDataIndex++) { DataGridColumn column = ColumnFromDisplayIndex(j); column.OnPastingCellClipboardContent(Items[i], rowData[rowDataIndex][columnDataIndex]); //column.OnPastingCellClipboardContent( } CommitEditCommand.Execute(this, this); if (i == maxRowIndex) { maxRowIndex++; hasAddedNewRow = true; } } } // update selection if (hasAddedNewRow) { UnselectAll(); UnselectAllCells(); CurrentItem = Items[minRowIndex]; if (SelectionUnit == DataGridSelectionUnit.FullRow) { SelectedItem = Items[minRowIndex]; } else if (SelectionUnit == DataGridSelectionUnit.CellOrRowHeader || SelectionUnit == DataGridSelectionUnit.Cell) { SelectedCells.Add(new DataGridCellInfo(Items[minRowIndex], Columns[minColumnDisplayIndex])); } } }
// ****************************************************************** /// <summary> /// This virtual method is called when ApplicationCommands.Paste command is executed. /// </summary> /// <param name="target"></param> /// <param name="args"></param> protected virtual void OnExecutedPaste(object target, ExecutedRoutedEventArgs args) { if (ExecutePasteEvent != null) { ExecutePasteEvent(target, args); if (args.Handled) { return; } } // parse the clipboard data [row][column] List <string[]> clipboardData = ClipboardHelper.ParseClipboardData(); bool hasAddedNewRow = false; #if DEBUG StringBuilder sb = new StringBuilder(); #endif int minRowIndex = Items.IndexOf(CurrentItem); int maxRowIndex = Items.Count - 1; int startIndexOfDisplayCol = (SelectionUnit != DataGridSelectionUnit.FullRow) ? CurrentColumn.DisplayIndex : 0; int clipboardRowIndex = 0; for (int i = minRowIndex; i <= maxRowIndex && clipboardRowIndex < clipboardData.Count; i++, clipboardRowIndex++) { if (i < this.Items.Count) { CurrentItem = Items[i]; BeginEditCommand.Execute(null, this); int clipboardColumnIndex = 0; for (int j = startIndexOfDisplayCol; clipboardColumnIndex < clipboardData[clipboardRowIndex].Length; j++, clipboardColumnIndex++) { // DataGridColumn column = ColumnFromDisplayIndex(j); DataGridColumn column = null; foreach (DataGridColumn columnIter in this.Columns) { if (columnIter.DisplayIndex == j) { column = columnIter; break; } } column?.OnPastingCellClipboardContent(Items[i], clipboardData[clipboardRowIndex][clipboardColumnIndex]); #if DEBUG sb.AppendFormat("{0,-10}", clipboardData[clipboardRowIndex][clipboardColumnIndex]); sb.Append(" - "); #endif } CommitEditCommand.Execute(this, this); if (i == maxRowIndex) { maxRowIndex++; hasAddedNewRow = true; } } #if DEBUG sb.Clear(); #endif } // update selection if (hasAddedNewRow) { UnselectAll(); UnselectAllCells(); CurrentItem = Items[minRowIndex]; if (SelectionUnit == DataGridSelectionUnit.FullRow) { SelectedItem = Items[minRowIndex]; } else if (SelectionUnit == DataGridSelectionUnit.CellOrRowHeader || SelectionUnit == DataGridSelectionUnit.Cell) { SelectedCells.Add(new DataGridCellInfo(Items[minRowIndex], Columns[startIndexOfDisplayCol])); } } }