Это потому, что вы ссылаетесь на sourceNode.Index
после того, как удалили его из дерева. Попробуйте сохранить индекс в переменной перед его удалением:
treeViewDocXml.BeginUpdate();
TreeNode sourceNode = treeViewDocXml.SelectedNode;
if (sourceNode.Parent == null)
{
return;
}
if (sourceNode.Index > 0)
{
var sourceIndex = sourceNode.Index;
var parentNode = sourceNode.Parent;
parentNode.Nodes.Remove(sourceNode);
parentNode.Nodes.Insert(sourceIndex - 1, sourceNode); //HERE CRASH
}
treeViewDocXml.EndUpdate();
[Update]
Ссылка на родительский узел также была неверной, поэтому я исправил это в примере.