internal void SetOldRecord(DataRow row, int proposedRecord)
{
if (!_inDataLoad)
{
row.CheckInTable();
CheckNotModifying(row);
}
if (proposedRecord == row._oldRecord)
{
return;
}
int originalRecord = row._oldRecord; // cache old record after potential RowChanging event
try
{
// Check whether we need to update indexes
if (LiveIndexes.Count != 0)
{
if ((-1 == originalRecord) && (-1 != proposedRecord) && (-1 != row._newRecord) && (proposedRecord != row._newRecord))
{
// the transition from DataRowState.Added -> DataRowState.Modified
// with same current record but new original record
// needs to raise an ItemChanged or ItemMoved instead of ItemAdded in the ListChanged event.
// for indexes/views listening for both DataViewRowState.Added | DataViewRowState.ModifiedOriginal
originalRecord = row._newRecord;
}
DataViewRowState originalRecordStatePre = row.GetRecordState(originalRecord);
DataViewRowState proposedRecordStatePre = row.GetRecordState(proposedRecord);
row._oldRecord = proposedRecord;
if (proposedRecord != -1)
{
_recordManager[proposedRecord] = row;
}
DataViewRowState originalRecordStatePost = row.GetRecordState(originalRecord);
DataViewRowState proposedRecordStatePost = row.GetRecordState(proposedRecord);
RecordStateChanged(originalRecord, originalRecordStatePre, originalRecordStatePost,
proposedRecord, proposedRecordStatePre, proposedRecordStatePost);
}
else
{
row._oldRecord = proposedRecord;
if (proposedRecord != -1)
{
_recordManager[proposedRecord] = row;
}
}
}
finally
{
if ((originalRecord != -1) && (originalRecord != row._tempRecord) &&
(originalRecord != row._oldRecord) && (originalRecord != row._newRecord))
{
FreeRecord(ref originalRecord);
}
// else during an event 'row.AcceptChanges(); row.BeginEdit(); row.EndEdit();'
if (row.RowState == DataRowState.Detached && row.rowID != -1)
{
RemoveRow(row, false);
}
}
}