Pregunta

Estoy trabajando con un objeto que tiene subobjetos dentro (ver ejemplo a continuación).Estoy intentando vincular un List<rootClass> a la cuadrícula de datos.Cuando ato el List<>, en la celda que contiene el subObject, veo el siguiente valor ... "namespace.subObject" ... los valores de cadena se muestran correctamente.

Lo ideal sería ver la propiedad "Descripción" del subObject en la celda de datos.¿Cómo puedo mapear el subObject.Description para mostrar en la celda de datos?

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; } }
}
¿Fue útil?

Solución

Si no me equivoco, muestra el resultado de llamar a .ToString () en su subObjeto, por lo que puede anularlo para devolver el contenido de Descripción.

¿Has intentado simplemente vincular a Value1.Description? (Supongo que no funciona).

Tengo una clase que puede usarse en lugar de List cuando se enlaza, que se encargará de esto, implementa ITypedList, que permite que una colección proporcione más " properties " para sus objetos, incluidas las propiedades calculadas.

La última versión de los archivos que tengo están aquí:

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

Para usar:

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

Básicamente, se vincula a una instancia de TypedList<T> en lugar de List<T>, y ajusta la propiedad BindableProperties. Tengo algunos cambios en el trabajo, incluido uno que solo acumula BindableProperties automáticamente a medida que avanza, pero aún no está en el tronco.

También puede agregar propiedades calculadas, como esta:

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

Otros consejos

Ya que mencionas DataGridViewColumn (etiquetas), supongo que te refieres a winforms.

Acceder a subpropiedades es una molestia;el administrador de moneda está vinculado a la lista, por lo que solo tiene acceso a las propiedades inmediatas de forma predeterminada;sin embargo, puedes superar esto si es absolutamente necesario mediante el uso de un descriptor de tipo personalizado.También necesitarías usar un token diferente, como "Foo_Bar" en lugar de "Foo.Bar".Sin embargo, este es un importante cantidad de trabajo que requiere conocimientos de PropertyDescriptor, ICustomTypeDescriptor y probablemente TypeDescriptionProvider, y casi seguro que no vale la pena,

La solución más sencilla es exponer la propiedad como shim/pass-thru:

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

Luego vincúlese a "Value2Description", etc.

No estoy seguro de si está utilizando ASP.NET, pero en caso afirmativo, puede utilizar una columna de plantilla y el método Eval () para mostrar valores de objetos anidados. P.ej. para mostrar la propiedad Descripción del subObjeto:

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

No estoy seguro de si buscas algo como esto ...

Podría escribir un método como:

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

Luego, une el objeto de esta manera:

<asp:Literal Text='<%# getSubObject(Eval("Value2")) %>' runat="server" />
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top