Domanda

Sto lavorando con un oggetto che contiene oggetti secondari (vedi esempio sotto). Sto tentando di associare un List<rootClass> al datagrid. Quando associo List<>, nella cella che contiene subObject, vedo il seguente valore ... "namespace.subObject" ... i valori di stringa vengono visualizzati correttamente.

Idealmente, vorrei vedere & # 8220; Descrizione & # 8221; proprietà di subObject.Description nella datacell. Come posso mappare <=> da mostrare nella datacell?

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; } }
}
È stato utile?

Soluzione

Se non sbaglio, mostra il risultato della chiamata .ToString () sul tuo subObject, quindi puoi sovrascriverlo per restituire il contenuto della Descrizione.

Hai provato ad associare Value1.Description? (Immagino che non funzioni).

Ho una classe che può essere utilizzata al posto di List durante l'associazione, che gestirà questo, implementa ITypedList, che consente a una raccolta di fornire più " proprietà " per i suoi oggetti, comprese le proprietà calcolate.

L'ultima versione dei file che ho sono qui:

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

Per usare:

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

Fondamentalmente si esegue il bind a un'istanza di TypedList<T> anziché List<T> e si regola la proprietà BindableProperties. Ho alcuni cambiamenti nel lavoro, incluso uno che crea automaticamente BindableProperties man mano che procede, ma non è ancora nel bagagliaio.

Puoi anche aggiungere proprietà calcolate, come questa:

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

o con .NET 3.5:

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

Altri suggerimenti

Dato che menzioni DataGridViewColumn (tag), presumo tu intenda le forme di win.

Accedere alle sotto-proprietà è una seccatura; il gestore di valuta è associato all'elenco, quindi per impostazione predefinita hai accesso solo alle proprietà immediate; tuttavia, puoi superare questo se ne hai assolutamente bisogno utilizzando un descrittore di tipo personalizzato. Dovresti usare anche un token diverso, come & Quot; Foo_Bar & Quot; anziché " Foo.Bar " ;. Tuttavia, questa è una grande quantità di lavoro che richiede la conoscenza di PropertyDescriptor, ICustomTypeDescriptor e probabilmente TypeDescriptionProvider, e quasi sicuramente non ne vale la pena,

La soluzione più semplice è esporre la proprietà come shim / pass-thru:

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

Quindi associa a " Value2Description " ecc.

Non sono sicuro che si stia utilizzando ASP.NET, ma in caso affermativo, è possibile utilizzare una colonna modello e il metodo Eval () per visualizzare i valori degli oggetti nidificati. Per esempio. per visualizzare la proprietà Description dell'oggetto secondario:

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

Non sono sicuro che si tratti di qualcosa del genere che stai cercando ...

Potresti scrivere un metodo come:

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

Quindi associa l'oggetto in questo modo:

<asp:Literal Text='<%# getSubObject(Eval("Value2")) %>' runat="server" />
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top