/// <summary> /// Constructor /// </summary> /// <param name="pGridVirtual"></param> /// <param name="pPosition"></param> public CellContext(GridVirtual pGridVirtual, Position pPosition) { Position = pPosition; Grid = pGridVirtual; Cell = Grid.GetCell(Position); }
/// <summary> /// Write the current loaded array string in the specified grid range. This method use the cell editor to set the value. /// </summary> /// <param name="destinationGrid"></param> /// <param name="destinationRange"></param> public void WriteData(GridVirtual destinationGrid, Range destinationRange) { //Calculate the destination Range merging the source range Range newRange = mSourceRange; newRange.MoveTo(destinationRange.Start); if (newRange.ColumnsCount > destinationRange.ColumnsCount) newRange.ColumnsCount = destinationRange.ColumnsCount; if (newRange.RowsCount > destinationRange.RowsCount) newRange.RowsCount = destinationRange.RowsCount; //Cut Data if (CutMode == CutMode.CutOnPaste && mSourceGrid != null) { for (int sr = mSourceRange.Start.Row; sr <= mSourceRange.End.Row; sr++) for (int sc = mSourceRange.Start.Column; sc <= mSourceRange.End.Column; sc++) { Position pos = new Position(sr, sc); Cells.ICellVirtual cell = mSourceGrid.GetCell(sr, sc); CellContext cellContext = new CellContext(mSourceGrid, pos, cell); if (cell.Editor != null) cell.Editor.ClearCell(cellContext); } } int arrayRow = 0; for (int r = newRange.Start.Row; r <= newRange.End.Row; r++, arrayRow++) { int arrayCol = 0; for (int c = newRange.Start.Column; c <= newRange.End.Column; c++, arrayCol++) { Position posCell = new Position(r, c); Cells.ICellVirtual cell = destinationGrid.GetCell(posCell); CellContext cellContext = new CellContext(destinationGrid, posCell, cell); if (cell != null && cell.Editor != null && mSourceValues[arrayRow, arrayCol] != null) cell.Editor.SetCellValue(cellContext, mSourceValues[arrayRow, arrayCol] ); } } }
/// <summary> /// Load the specified range data into a string array. This method use the cell editor to get the value. /// </summary> /// <param name="sourceGrid"></param> /// <param name="sourceRange"></param> /// <param name="startDragPosition">Starting drag position. Used only for calculating drop destination range.</param> /// <param name="cutMode">Cut mode. Can be used to remove the data from the source when pasting it to the destination or immediately.</param> public void LoadData(GridVirtual sourceGrid, Range sourceRange, Position startDragPosition, CutMode cutMode) { mSourceGrid = sourceGrid; mCutMode = cutMode; mStartDragPosition = startDragPosition; mSourceRange = sourceRange; mSourceValues = new string[mSourceRange.RowsCount, mSourceRange.ColumnsCount]; int arrayRow = 0; for (int r = mSourceRange.Start.Row; r <= mSourceRange.End.Row; r++, arrayRow++) { int arrayCol = 0; for (int c = mSourceRange.Start.Column; c <= mSourceRange.End.Column; c++, arrayCol++) { Position posCell = new Position(r, c); Cells.ICellVirtual cell = sourceGrid.GetCell(posCell); CellContext cellContext = new CellContext(sourceGrid, posCell, cell); if (cell != null && cell.Editor != null && cell.Editor.IsStringConversionSupported()) mSourceValues[arrayRow, arrayCol] = cell.Editor.ValueToString( cell.Model.ValueModel.GetValue(cellContext) ); else if (cell != null) mSourceValues[arrayRow, arrayCol] = cellContext.DisplayText; } } //Cut Data if (CutMode == CutMode.CutImmediately && sourceGrid != null) { sourceGrid.ClearValues(new RangeRegion(sourceRange)); //for (int sr = sourceRange.Start.Row; sr <= sourceRange.End.Row; sr++) // for (int sc = sourceRange.Start.Column; sc <= sourceRange.End.Column; sc++) // { // Position pos = new Position(sr, sc); // Cells.ICellVirtual cell = sourceGrid.GetCell(sr, sc); // CellContext cellContext = new CellContext(sourceGrid, pos, cell); // if (cell.Editor != null) // cell.Editor.ClearCell(cellContext); // } } mClipboardDataObject = new System.Windows.Forms.DataObject(); mClipboardDataObject.SetData(RANGEDATA_FORMAT, this); mClipboardDataObject.SetData(typeof(string), DataToString(mSourceValues, mSourceRange)); }
/// <summary> /// Convert a range and an array of string into a string. Normally using a tab delimited for columns and a LineFeed for rows. /// </summary> /// <returns></returns> protected static string[,] DataToStringArray(GridVirtual sourceGrid, Range range) { int numberOfRows = range.End.Row - range.Start.Row + 1; int numberOfCols = range.End.Column - range.Start.Column + 1; string[,] values = new string[numberOfRows, numberOfCols]; int arrayRow = 0; for (int r = range.Start.Row; r <= range.End.Row; r++, arrayRow++) { int arrayCol = 0; for (int c = range.Start.Column; c <= range.End.Column; c++, arrayCol++) { String val = String.Empty; Position posCell = new Position(r, c); Cells.ICellVirtual cell = sourceGrid.GetCell(posCell); CellContext cellContext = new CellContext(sourceGrid, posCell, cell); if (cell != null && cell.Editor != null && cell.Editor.IsStringConversionSupported()) values[arrayRow, arrayCol] = cell.Editor.ValueToString(cell.Model.ValueModel.GetValue(cellContext)); else if (cell != null) values[arrayRow, arrayCol] = cellContext.DisplayText; } } return values; }
/// <summary> /// Write the current loaded array string in the specified grid range. This method use the cell editor to set the value. /// </summary> public void WriteData(GridVirtual sourceGrid, Position destinationPosition) { int sourceRow = this.SourceValues.GetUpperBound(0) ; int sourceColumn = this.SourceValues.GetUpperBound(1); var dataRow = 0; for (int r = destinationPosition.Row; r <= destinationPosition.Row + sourceRow; r++) { int dataColumn = 0; for (int c = destinationPosition.Column; c <= destinationPosition.Column + sourceColumn; c++) { Position posCell = new Position(r, c); Cells.ICellVirtual cell = sourceGrid.GetCell(posCell); CellContext cellContext = new CellContext(sourceGrid, posCell, cell); if (cell != null && cell.Editor != null && mSourceValues[dataRow, dataColumn] != null) cell.Editor.SetCellValue(cellContext, mSourceValues[dataRow, dataColumn] ); dataColumn++; } dataRow++; } /*int sourceRow = this.SourceValues.Length - 1; int sourceColumn = this.SourceValues.Rank - 1; //Calculate the destination Range merging the source range var destinationRange = new Range(destinationPosition, new Position(destinationPosition.Row + sourceRow, destinationPosition.Column + sourceColumn)); Range newRange = mSourceRange; newRange.MoveTo(destinationRange.Start); if (newRange.End.Column > destinationRange.End.Column) newRange.End = new Position(newRange.End.Row, destinationRange.End.Column); if (newRange.End.Row > destinationRange.End.Row) newRange.End.Row = destinationRange.End.Row; for (int r = newRange.Start.Row; r <= newRange.End.Row; r++) { int dataColumn = 0; for (int c = newRange.Start.Column; c <= newRange.End.Column ; c++) { //if (sourceGrid.Columns.IsColumnVisible(c) == false) // continue; Position posCell = new Position(r, c); Cells.ICellVirtual cell = sourceGrid.GetCell(posCell); CellContext cellContext = new CellContext(sourceGrid, posCell, cell); if (cell != null && cell.Editor != null && mSourceValues[r - newRange.Start.Row, dataColumn] != null) cell.Editor.SetCellValue(cellContext, mSourceValues[r - newRange.Start.Row, dataColumn] ); dataColumn++; } }*/ }
/// <summary> /// Load the specified range data into a string array. This method use the cell editor to get the value. /// </summary> /// <param name="sourceGrid"></param> /// <param name="sourceRange"></param> /// <param name="cutMode">Cut mode. Can be used to remove the data from the source when pasting it to the destination or immediately.</param> public static RangeData LoadData(GridVirtual sourceGrid, Range sourceRange, CutMode cutMode) { RangeData data = new RangeData(sourceGrid); //mCutMode = cutMode; data.mSourceRange= sourceRange; data.mSourceValues = new object[sourceRange.RowsCount, GetVisibleColumnCount(sourceGrid, sourceRange)]; int arrayRow = 0; for (int r = sourceRange.Start.Row; r <= sourceRange.End.Row; r++, arrayRow++) { int arrayCol = 0; for (int c = sourceRange.Start.Column; c <= sourceRange.End.Column; c++) { if (sourceGrid.Columns.IsColumnVisible(c) == false) continue; Position posCell = new Position(r, c); Cells.ICellVirtual cell = sourceGrid.GetCell(posCell); CellContext cellContext = new CellContext(sourceGrid, posCell, cell); /*if (cell != null && cell.Editor != null && cell.Editor.IsStringConversionSupported()) data.mSourceValues[arrayRow, arrayCol] = cell.Editor.ValueToString( cell.Model.ValueModel.GetValue(cellContext) ); else if (cell != null) data.mSourceValues[arrayRow, arrayCol] = cellContext.DisplayText;*/ if (cell != null) data.mSourceValues[arrayRow, arrayCol] = cellContext.Value; arrayCol++; } } //Cut Data if (cutMode == CutMode.CutImmediately && sourceGrid != null) { sourceGrid.ClearValues(new RangeRegion(sourceRange)); } data.mClipboardDataObject = new System.Windows.Forms.DataObject(); data.mClipboardDataObject.SetData(RANGEDATA_FORMAT, data); string[,] values = DataToStringArray(sourceGrid, data.mSourceRange); data.mClipboardDataObject.SetData(typeof(string), StringArrayToString(values)); return data; }