/// <inheritdoc/> public void CopyFeatures(IFeatureSet source, bool copyAttributes) { ProgressMeter = new ProgressMeter(ProgressHandler, "Copying Features", ShapeIndices.Count); Vertex = source.Vertex.Copy(); _shapeIndices = new List<ShapeRange>(); foreach (ShapeRange range in source.ShapeIndices) { _shapeIndices.Add(range.Copy()); } if (copyAttributes) { foreach (DataColumn dc in source.GetColumns()) { if (dc != null) { DataColumn outCol = new DataColumn(dc.ColumnName, dc.DataType, dc.Expression, dc.ColumnMapping); Field fld = new Field(outCol); DataTable.Columns.Add(fld); } } } if (source.AttributesPopulated) { // Handle data table content directly if (!IndexMode) { // If not in index mode, just handle this using features Features.SuspendEvents(); int i = 0; foreach (IFeature f in source.Features) { IFeature copy = AddFeature(f.BasicGeometry); copy.ShapeIndex = ShapeIndices[i]; if (copyAttributes) { copy.DataRow.ItemArray = f.DataRow.ItemArray.Copy(); } i++; } Features.ResumeEvents(); } else { // We need to copy the attributes, but just copy a datarow if (copyAttributes) { foreach (DataRow row in source.DataTable.Rows) { DataRow result = DataTable.NewRow(); result.ItemArray = row.ItemArray.Copy(); DataTable.Rows.Add(result); } } } } else { AttributesPopulated = false; // Handle data table content directly if (!IndexMode) { // If not in index mode, just handle this using features Features.SuspendEvents(); int i = 0; foreach (IFeature f in source.Features) { IFeature result = AddFeature(f.BasicGeometry); result.ShapeIndex = ShapeIndices[i]; i++; } Features.ResumeEvents(); } if (copyAttributes) { // We need to copy the attributes, but use the page system int maxRow = NumRows(); const int pageSize = 10000; int numPages = (int)Math.Ceiling(maxRow / (double)pageSize); for (int i = 0; i < numPages; i++) { int numRows = pageSize; if (i == numPages - 1) { numRows = numPages - (pageSize * i); } DataTable dt = source.GetAttributes(i * pageSize, numRows); SetAttributes(i * pageSize, dt); } } } }