In un blog di Andrea suggeriva questo workaround "Perchè quando ci vuole, ci vuole... Reflection :-)" per catturare la posizione di una certa Datarow: con reflection andare a leggere la variabile privata "rowID". Il workaround funziona ma non sampre... o per lo meno ho avuto problemi quando nella datatable devo aggiungere e togliere elementi... la variabile non sembra cambiare valore :(
Il workaound che ho trovato in sostituzione fa smepre uso di reflection ma è in un certo senso più documentato del precedente. La DataRowCollection ha infatti la proprietà protetta List che contiene da disegno gli elementi della collezione. Ho ragione di pensare che tale collezione sia anche correttamente ordinata... per cui scritto questo nuovo wrapper per bypassare il problema:
public static int GetRowId(DataRow row)
{
//FieldInfo rowFieldsInfo = typeof(DataRow).GetField("rowID", BindingFlags.NonPublic | BindingFlags.Instance);
//return (int) rowFieldsInfo.GetValue(row);
PropertyInfo protectedListProp =
typeof(DataRowCollection).GetProperty(
"List", BindingFlags.NonPublic | BindingFlags.Instance);
IList rows = (IList) protectedListProp.GetValue(row.Table.Rows, null);
return rows.IndexOf(row);
}
Il workaround sembra funzionare! :-p