Question

Je travaille avec un objet contenant des sous-objets (voir l'exemple ci-dessous). Je tente de lier un List<rootClass> à la grille de données. Lorsque je lie le List<>, dans la cellule contenant le subObject, je vois la valeur suivante ... "namespace.subObject" ... les valeurs de chaîne s'affichent correctement.

Idéalement, j'aimerais voir la & # 8220; Description & # 8221; propriété du subObject.Description dans la cellule de données. Comment mapper le <=> à afficher dans la cellule de données?

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; } }
}
Était-ce utile?

La solution

Si je ne me trompe pas, il indique le résultat de l'appel de .ToString () sur votre sous-objet, vous pouvez donc le remplacer pour renvoyer le contenu de Description.

Avez-vous essayé de vous lier simplement à Value1.Description? (Je suppose que ça ne marche pas).

J'ai une classe qui peut être utilisée à la place de List lors de la liaison, qui gérera cela, elle implémentera ITypedList, ce qui permet à une collection de fournir davantage de & "propriétés &"; pour ses objets, y compris les propriétés calculées.

La dernière version de mes fichiers est la suivante:

https://gist.github.com/lassevk/64ecea836116882a5d59bf455404)

Pour utiliser:

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

En gros, vous vous connectez à une instance de TypedList<T> au lieu de List<T> et ajustez la propriété BindableProperties. J'ai quelques changements dans le travail, y compris un qui construit simplement BindableProperties automatiquement au fur et à mesure, mais il n'est pas encore dans le coffre.

Vous pouvez également ajouter des propriétés calculées, comme ceci:

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

ou avec .NET 3.5:

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

Autres conseils

Puisque vous mentionnez DataGridViewColumn (tags), je suppose que vous parlez de winforms.

L’accès aux sous-propriétés est une douleur; le gestionnaire de devises est lié à la liste, vous avez donc uniquement accès aux propriétés immédiates par défaut; Cependant, vous pouvez éviter cela si vous avez absolument besoin en utilisant un descripteur de type personnalisé. Vous devrez également utiliser un autre jeton, comme & "Foo_Bar &"; au lieu de & "Foo.Bar &"; Toutefois, il s’agit d’un travail important qui nécessite la connaissance de PropertyDescriptor, ICustomTypeDescriptor et probablement TypeDescriptionProvider, et qui ne vaut certainement pas la peine

,

La solution la plus simple consiste à exposer la propriété en tant que shim / pass-thru:

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

Liez ensuite à " Value2Description " etc.

Je ne sais pas si vous utilisez ASP.NET, mais si c'est le cas, vous pouvez utiliser une colonne de modèle et la méthode Eval () pour afficher les valeurs des objets imbriqués. Par exemple. pour afficher la propriété Description du sous-objet:

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

Vous ne savez pas si c'est quelque chose comme ça ...

Vous pouvez écrire une méthode telle que:

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

Liez ensuite l'objet de cette manière:

<asp:Literal Text='<%# getSubObject(Eval("Value2")) %>' runat="server" />
scroll top