Frage

Ich habe eine ASP.net Gridview auf eine Sammlung von anonymen Typen gebunden ist.

Wie kann ich eine der Eigenschaften der anonymen Typen in dem RowDataBound Ereignishandler verweisen?

Ich bin schon bewusst, wie die anonyme Art so zu werfen:

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;
}

Ich denke, die meisten würde sagen, das ist etwas chaotisch, auch wenn es funktioniert. In meinem realen Code, ich habe mehr als 3 Eigenschaften und ich würde Code an zwei Stellen aktualisieren muß jederzeit ich hinzugefügt oder neu geordnet, die Eigenschaften meines anonymen Typs.

Gibt es eine bessere Art und Weise e.Row.DataItem zu sagen, dass es eine bestimmte Eigenschaft eines bestimmten Typs hat und das Objekt zu zwingen mich, diesen Wert zu geben (neben Erstellen einer Klasse)?

War es hilfreich?

Lösung

Die Art und Weise (Guss mit gutem Beispiel) verwenden, ist chaotisch und sehr spröde - I wirklich würde es nicht empfehlen (wenn Sie eine Eigenschaft hinzufügen, oder ihnen einen Namen geben in einer anderen Reihenfolge, wird brechen, etc.). Der bessere Ansatz ist Ihre eigene genannte Art in der Projektion zu verwenden.

Andere Tipps

Schauen Sie in Reflexion verwendet wird.

Beispiel:

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!  :)
}

Fehlerüberprüfung und Optimierung als Übung dem Leser überlassen.

Eine bessere Möglichkeit wäre, eine Art zu schaffen, dies zu umgehen und so muss man all das Casting nicht tut den anonymen Typen zu verwenden.

Was ich tue, ist ... zum Beispiel:

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

... aber das ist in einer Listenansicht ItemDataBound Event-Handler. Dachte, es könnte für jemanden nützlich sein.

Nein, ich glaube nicht, dass es ein besserer Weg, als dies. Die C # Jungs wirklich nicht mit anonymen Typen außerhalb der lokalen Methode Umfang unterstützen (das heißt hier haben Sie einen anonymen Typ zu Ihrem Row Objekt angebracht.)

Der üblicher Vorschlag, statt eine echte Klasse zu machen wäre.

Die Methode verwenden Sie das anonyme Objekt zu werfen (während sehr cool) ist ein Hack. Es funktioniert einfach, weil die C # Compiler ist intelligent genug, nur für die gesamte App eine Instanz der anonymen Klasse zu erstellen, wenn die Eigenschaften gleich sind. So gibt es wirklich keinen Nutzen anonyme Typen in Verwendung, da eine Klasse ohnehin hinter den Kulissen erstellt wird. Ja, Sie können es hacken, können Sie Reflektion verwenden, aber seriosuly, warum die Mühe? Was nützt es zu verwenden Anonyme Typen in diesem Fall?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top