/// <summary> /// Retrieves a subset of rows with the pending updates applied. If more rows than exist /// are requested, only the rows that exist will be returned. /// </summary> /// <param name="startIndex">Index to start returning rows from</param> /// <param name="rowCount">The number of rows to return.</param> /// <returns>An array of rows with pending edits applied</returns> public async Task <EditRow[]> GetRows(long startIndex, int rowCount) { ThrowIfNotInitialized(); // Get the cached rows from the result set ResultSetSubset cachedRows = startIndex < associatedResultSet.RowCount ? await associatedResultSet.GetSubset(startIndex, rowCount) : new ResultSetSubset { RowCount = 0, Rows = new DbCellValue[][] { } }; // Convert the rows into EditRows and apply the changes we have List <EditRow> editRows = new List <EditRow>(); for (int i = 0; i < cachedRows.RowCount; i++) { long rowId = i + startIndex; RowEditBase edr; if (EditCache.TryGetValue(rowId, out edr)) { // Ask the edit object to generate an edit row editRows.Add(edr.GetEditRow(cachedRows.Rows[i])); } else { // Package up the existing row into a clean edit row EditRow er = new EditRow { Id = rowId, Cells = cachedRows.Rows[i].Select(cell => new EditCell(cell, false)).ToArray(), State = EditRow.EditRowState.Clean }; editRows.Add(er); } } // If the requested range of rows was at the end of the original cell set and we have // added new rows, we need to reflect those changes if (rowCount > cachedRows.RowCount) { long endIndex = startIndex + cachedRows.RowCount; var newRows = EditCache.Where(edit => edit.Key >= endIndex).Take(rowCount - cachedRows.RowCount); editRows.AddRange(newRows.Select(newRow => newRow.Value.GetEditRow(null))); } return(editRows.ToArray()); }
/// <summary> /// Reverts a cell in a pending edit /// </summary> /// <param name="rowId">Internal ID of the row to have its edits reverted</param> /// <param name="columnId">Ordinal ID of the column to revert</param> /// <returns>String version of the old value for the cell</returns> public EditRevertCellResult RevertCell(long rowId, int columnId) { ThrowIfNotInitialized(); // Attempt to get the row edit with the given ID RowEditBase pendingEdit; if (!EditCache.TryGetValue(rowId, out pendingEdit)) { throw new ArgumentOutOfRangeException(nameof(rowId), SR.EditDataUpdateNotPending); } // Update the row EditRevertCellResult revertResult = pendingEdit.RevertCell(columnId); CleanupEditIfRowClean(rowId, revertResult); // Have the edit base revert the cell return(revertResult); }