Hace un par de días comenté el efecto de ejecución doble de ItemCreated que se podía dar al enlazar ciertos DataGrids en una página Web. Una forma posible e evitarlo (entre otras muchas) sería redefinir el evento LoadViewState de la página para marcar con un indicador booleano cuándo se está ejecutando, una cosa así:
private boolean RestaurandoViewState = false;
protected override void LoadViewState(object savedState)
{
this.RestaurandoViewState = true;
base.LoadViewState(savedState);
this.RestaurandoViewState = false;
}
De este modo durante el evento ItemCreated sólo tenemos que comprobar si se está restaurando el ViewState o no, ejecutando el código sólo en caso de que no.