When connecting to a table, much more work is done to record and track the state with each change.
For example, if you do this,
theRow.BeginEdit(); for (int j = 0; j < NUM_COLS_TO_WRITE_TO; j++) { theRow[j] = "whatever"; } theRow.CancelEdit();
Then in BeginEdit() , internally it takes a copy of the contents of the string, so that at any point, you can roll back - and the final result above - this is an empty string again without whatever . This is possible, even in BeginLoadData mode. Along the BeginEdit path, if it is bound to a DataTable, you enter DataTable.NewRecord () which shows that it simply copies each value for each column to maintain the original state if cancellation is required - there is not much magic here. On the other hand, if it is not bound to a datatable, then it does not happen at BeginEdit in BeginEdit , and it completes quickly.
EndEdit() also quite heavy (when attached), since all restrictions are checked here, etc. (maximum length, whether columns allow zeros, etc.). It also fires a bunch of events, explicitly frees the storage used if editing has been canceled, and makes it available for calling using DataTable.GetChanges() , which is still possible in BeginLoadData . Infact, looking at the source, all BeginLoadData seems to BeginLoadData off constraint checking and indexing.
So this describes what BeginEdit and EditEdit , and they are completely different when they are attached or not attached to the terms of what is stored. Now consider that one theRow[j] = "whatever" , which you can see in the indexer installer for DataRow , it calls BeginEditInternal and then EditEdit on each single call (if it has not been edited yet, because you explicitly called BeginEdit earlier) . Thus, this means that it copies and saves each individual value for each column in the row, each time you make this call. So you do it 10 times, which means that your 1000 columns of DataTable, more than 50,000 rows, means that it allocates 500,000,000 objects. In addition, all other versions, checks and events are triggered after each change, and, in general, it is much slower when a row is bound to a DataTable than when not.