Question

J'ai lié un ASP.net GridView à une collection de types anonymes.

Comment référencer l'une des propriétés des types anonymes dans le gestionnaire d'événements RowDataBound?

Je connais déjà le moyen de convertir le type anonyme de la manière suivante:

protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        var AnonObj = Cast(e.Row.DataItem, 
          new { StringProperty = "", BoolProperty = false, IntProperty = 0 });

        if (AnonObj.BoolProperty)
        {
            e.Row.Style.Add(HtmlTextWriterStyle.Color, "Red");
        }
    }
}


T Cast<T>(object obj, T type)
{
    return (T)obj;
}

Je pense que la plupart des gens diraient que c'est désordonné, même si cela fonctionne. Dans mon code réel, j'ai plus de 3 propriétés et je devrais mettre à jour le code à deux endroits chaque fois que j'ajoute ou réorganise les propriétés de mon type anonyme.

Existe-t-il un meilleur moyen d'indiquer à e.Row.DataItem qu'il possède une propriété spécifique d'un type spécifique et de forcer l'objet à me donner cette valeur (en plus de la création d'une classe)?

Était-ce utile?

La solution

La façon dont vous utilisez (exemple) est confuse et très fragile - Je vraiment ne le recommande pas (si vous ajoutez une propriété ou nommez-la dans un ordre différent, ça va casser, etc.). La meilleure approche consiste à utiliser votre propre type nommé dans la projection.

Autres conseils

Examinez l'utilisation de la réflexion.

Exemple:

object o = e.Row.DataItem;
Type t = o.GetType();
PropertyInfo pi = t.GetProperty("StringProperty");
if (pi != null && pi.PropertyType == typeof(string))
{
  // the property exists!
  string s = pi.GetValue(o, null) as string;
  // we have the value
  // insert your code here
  // PROFIT!  :)
}

Vérification des erreurs et optimisation laissés comme un exercice au lecteur.

Un meilleur moyen serait de créer un type pour gérer cela afin de ne pas avoir à faire tout ce casting pour utiliser le type anonyme.

Ce que je fais est ... par exemple,

string Name = (string)DataBinder.Eval(dataItem.DataItem, "Name");

... mais cela se trouve dans un gestionnaire d'événements listview ItemDataBound . Je pensais que cela pourrait être utile pour quelqu'un.

Non, je ne crois pas qu'il existe un meilleur moyen que celui-ci. Les utilisateurs de C # ne prennent pas vraiment en charge l’utilisation de types anonymes en dehors de la portée de la méthode locale (c’est-à-dire qu’un type anonyme est associé à votre objet Row.)

La suggestion habituelle serait de faire une vraie classe à la place.

La méthode que vous utilisez pour convertir l'objet anonyme (en étant très cool) est un hack. Cela fonctionne simplement parce que le compilateur C # est suffisamment intelligent pour ne créer qu'une instance de la classe anonyme pour l'ensemble de l'application si les propriétés sont identiques. Il n’ya donc aucun avantage à utiliser des types anonymes, car une classe est en cours de création en coulisse. Oui, vous pouvez le pirater, vous pouvez utiliser la réflexion, mais sérieusement, pourquoi déranger? Quel avantage y at-il à utiliser des types anonymes dans ce cas?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top