Les types anonymes au sein de l’évènemment ItemDataBound

Au travers de cet article, nous allons explorer une nouveauté du langage C# 4.0 : le typage dynamique. Il est très facile de récupèrer ses données au sein d’un Repeater à travers la propriété DataItem, en les castant dans notre type source comme dans l’exemple ci-dessous.

Repeater utilisé pour notre exemple

Le code ci-dessus présente notre repeater basique avec l’évènemment ItemDataBound lié. Nous utiliserons la classe Document suivante :

1
2
3
4
5
public class Document {
 
    public int DocId { get; set; }
    public string DocTitre { get; set; }
}

On remplit notre Repeater à l’aide de nos données :

1
2
3
4
5
6
7
8
9
10
11
12
protected void Page_Load(object sender, EventArgs e) {
 
    List<Document> documents = new List<Document> {
        new Document { DocId = 1, DocTitre = "Rapport de stage"}, 
        new Document { DocId = 2, DocTitre = "Documentation"}, 
        new Document { DocId = 3, DocTitre = "Samples"}, 
        new Document { DocId = 4, DocTitre = "Hello world"}
    };
 
    rptDocument.DataSource = documents;
    rptDocument.DataBind();
}

Ce code basique va nous afficher une liste de nos documents. On peut récupérer notre Item au sein de l’évènemment ItemDataBound par l’intermédiaire de notre propriété e.Data.DataItem en la castant.

1
2
3
4
5
6
7
8
9
protected void rptDocument_ItemDataBound(object sender, RepeaterItemEventArgs e) {
 
    if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType 
== ListItemType.AlternatingItem) {
 
        Document doc = (Document)e.Item.DataItem; 
        int DocId = doc.DocId;
    }
}

Ce code est simple, mais lorque nous devons récupérer des valeurs d’un type anonyme, c’est un peu moins élégant. Nous devons passer par DataBinder.Eval :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
protected void Page_Load(object sender, EventArgs e) {
 
    List<Document> documents = new List<Document> {
        new Document { DocId = 1, DocTitre = "Rapport de stage"}, 
        new Document { DocId = 2, DocTitre = "Documentation"}, 
        new Document { DocId = 3, DocTitre = "Samples"}, 
        new Document { DocId = 4, DocTitre = "Hello world"}
    };
 
    var docs = from d in documents
                   select new { DocTitre = d.DocTitre };
 
    rptDocument.DataSource = docs;
    rptDocument.DataBind();
}
 
public void PersonDataBound(object sender, RepeaterItemEventArgs e)
{
    if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType 
== ListItemType.AlternatingItem)
    {
        string DocTitre = Convert.ToString(DataBinder.Eval(e.Item.DataItem, "DocTitre"));
        //mon traitement
    }
}

Grâce à C# 4.0, le code est plus simple et intuitif, en passant par le typage dynamique :

1
2
3
4
5
6
7
8
9
10
11
12
protected void rptDocument_ItemDataBound(object sender, RepeaterItemEventArgs e) {
 
    if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType 
== ListItemType.AlternatingItem) {
 
        //on veut récupérer le titre pour faire des traitements
        dynamic doc = (dynamic)e.Item.DataItem;
        string titre = doc.DocTitre;
 
        //notre taff à faire sur le titre
    }
}

Bien que j’étais récalcitrant à cette possiblité, il est vrai que dans certains cas, l’utilisation faite peut être utile / plus intuitive.