Frage

ich mit einem Objekt arbeite, die innerhalb der Unterobjekte haben (siehe Beispiel unten). Ich versuche, eine List<rootClass> an das Datagrid zu binden. Als ich die List<>, in der Zelle binden, die die subObject enthält, sehe ich der folgende Wert korrekt die String-Werte Anzeige ... "namespace.subObject" ....

Im Idealfall würde Ich mag die Eigenschaft „Beschreibung“ des subObject im Datacell sehen. Wie kann ich die subObject.Description Karte in der Datacell zeigen?

public class subObject
{
   int id;
   string description;

   public string Description
   { get { return description; } }
}

public class rootClass
{
   string value1;
   subObject value2;
   string value3;

   public string Value1
   { get { return value1; } }

   public subObject Value2
   { get { return value2; } }

   public string Value3
   { get { return value3; } }
}
War es hilfreich?

Lösung

Wenn mich nicht alles täuscht, es zeigt das Ergebnis des Aufrufs .ToString () auf Ihrem SUBOBJECT, so können Sie, dass außer Kraft setzen den Inhalt der Beschreibung zurückzukehren.

Haben Sie versucht, nur zu Value1.Description Bindung? (Ich bin es erraten nicht funktioniert).

Ich habe eine Klasse, die statt Liste verwendet werden kann, wenn die Bindung, die damit umgehen wird, es implementiert ITypedList, die eine Sammlung mehr „Eigenschaften“ für seine Objekte bieten kann, einschließlich dem berechneten Eigenschaften.

Die letzte Version der Dateien, die ich haben sind hier:

https://gist.github.com/lassevk/64ecea836116882a5d59b0f235858044

So verwenden:

List<rootClass> yourList = ...
TypedListWrapper<rootClass> bindableList = new TypedListWrapper<rootClass>(yourList);
bindableList.BindableProperties = "Value1;Value2.Description;Value3.Description";
gridView1.DataSource = bindableList;

Grundsätzlich binden Sie zu einer Instanz von TypedList<T> statt List<T>, und stellen Sie die BindableProperties Eigenschaft. Ich habe einige Veränderungen in der Arbeit, darunter eine, die BindableProperties baut nur automatisch, wie es geht, aber es ist nicht im Kofferraum noch.

Sie können auch berechnete Eigenschaften, wie folgt hinzufügen

yourList.AddCalculatedProperty<Int32>("DescriptionLength",
    delegate(rootClass rc)
    {
        return rc.Value2.Description.Length;
    });

oder mit .NET 3.5:

yourList.AddCalculatedProperty<Int32>("DescriptionLength",
    rc => rc.Value2.Description.Length);

Andere Tipps

Da Sie erwähnen DataGridViewColumn (Tags), ich nehme an, Sie meinen winforms.

Zugriff auf Untereigenschaften ist ein Schmerz; die währungs Manager wird in die Liste gebunden, so dass Sie nur den Zugriff auf sofortige Eigenschaften haben standardmäßig; Sie können jedoch über diese , wenn Sie unbedingt benötigen durch einen benutzerdefinierten Typdeskriptor verwenden. Sie müssten auch eine andere Token verwenden, wie „foo_bar“ statt „Foo.Bar“. Dies ist jedoch ein großer Menge der Arbeit, die Kenntnisse von PropertyDescriptor erfordert, ICustomTypeDescriptor und wahrscheinlich TypeDescriptionProvider, und mit ziemlicher Sicherheit ist es nicht wert,

Die einfachste Lösung ist die Eigenschaft als Shim / Pass-Thru aussetzen:

public string Value2Description {
    get {return Value2.Description;} // maybe a null check too
}

Dann binden an "Value2Description" etc.

Ich bin mir nicht sicher, ob Sie ASP.NET verwenden, aber wenn ja, dann können Sie eine Vorlagenspalte und die Eval () Methode verwenden, um Werte von verschachtelten Objekten angezeigt werden soll. Z.B. die Beschreibung Eigenschaft des SUBOBJECT anzuzeigen:

<asp:GridView ID="grid" runat="server" AutoGenerateColumns="true">
  <Columns>
    <asp:TemplateField>
      <ItemTemplate>
        <asp:Literal Text='<%# Eval("Value2.Description") %>' runat="server" />
      </ItemTemplate>
    </asp:TemplateField>
  </Columns>
</asp:GridView>

Nicht sicher, ob es etwas ist, wie dies Sie sind nach ...

Sie können eine Methode, wie schreiben:

protected string getSubObject(object o)
{
    string result = string.empty;

    try
    {
        result = ((subObject)o).Description;
    }
    catch
    { /*Do something here to handle/log your exception*/ } 

    return result;
}

Dann binden Sie das Objekt so etwas wie folgt aus:

<asp:Literal Text='<%# getSubObject(Eval("Value2")) %>' runat="server" />
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top