jump to navigation

Note pour plus tôt février 2, 2006

Posted by eleguehennec in .Net.
trackback

L'autre jour, je cherchais une interface implémentée par un DataSet et un IEnumerable. Eh bien si cette interface n'existe pas, il existe une méthode permettant de faire la conversion.

Comme tout le monde le sait -ou presque- le contrôle System.Web.WinUI.DataGrid prend en DataSource un objet. On lui passe souvent un DataSet, mais il est aussi capable de prendre un IEnumerable. Eh bien en creusant un peu, j'ai trouvé dans le namespace System.Web.WinUI une classe DataSourceHelper, internal sealed -excusez du peu !- avec une unique méthode GetResolvedDataSource qui convertit un object implémentant IListSource (donc un DataSet) en IEnumerable. C'est cette méthode qui est utilisée lors de l'appel de la méthode DataBind().

Bon, c'est vrai qu'elle n'est pas très visible. Mais tant que reflector la voit… Il ne me reste plus qu'à me souvenir où j'en ai eu besoin.


Commentaires»

1. cgrand - février 3, 2006

Tu verras : toi aussi, un jour, tu seras ton meilleur ami.

2. Olivier - juin 20, 2006

Eric, il y a plus simple :
Comme tu l’as remarqué, DataSet implémente (explicitement) IListSource ; hors IListSource propose la méthode GetList qui te renvoie un IList, et IList implémente IEnumerable (et ICollection). Et voilà !
En fait, GetResolvedDataSource, fait un peu joujou avec les PropertyDescriptors pour retrouver le Data member (tu sais les trucs qui permettent de faire du binding entre collections et contrôles). Donc, si tu veux juste récupérer un IEnumerable, le plus simple c’est ça :

foreach (object obj in ((IListSource)myDataset).GetList())
{

}

3. Olivier - juin 20, 2006

Je viens d’essayer le code ci-dessus, et je ne vois pas son intérêt : je récupère un seul objet de type System.Data.DataViewManagerListItemTypeDescriptor

Pourquoi tout simplement ne pas boucler sur des lignes ?
foreach (DataRow dr in ds.Tables[0].Rows) { …

4. eleguehennec - juin 21, 2006

L’idée c’était d’avoir un super type dont IEnumerable et DataSet héritent pour pouvoir itérer dessus écrire quelque chose comme :
void Enumerate(object myList)
{
if (myList is IEnumerable)
foreach (object o in myList) DoIt();
else if (myList is DataSet)
foreach (DataRow dr in ds.Tables[0].Rows) DoIt();
else throw new Exception(“Unmanaged type”);
}