mostrar - fill datagridview c#
Enlazar un objeto con un subobjeto como propiedades a una cuadrĂcula de datos (4)
Estoy trabajando con un objeto que tiene sub objetos dentro (ver ejemplo a continuación). Estoy intentando vincular una List<rootClass>
a la cuadrícula de datos. Cuando enlace la List<>
, en la celda que contiene el subObject
, veo el siguiente valor ... "namespace.subObject" ...
los valores de cadena se muestran correctamente.
Idealmente, me gustarí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; } }
}
No estoy seguro de si está utilizando ASP.NET, pero si es así, puede usar una columna de plantilla y el método Eval () para mostrar los valores de los objetos anidados. Por ejemplo, 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>
Como mencionas DataGridViewColumn
(etiquetas), supongo que te refieres a las formas de ganar.
El acceso a sub-propiedades es un dolor; el administrador de divisas está vinculado a la lista, por lo que solo tiene acceso a las propiedades inmediatas de forma predeterminada; sin embargo, puede superar esto si lo necesita con un descriptor de tipo personalizado. También necesitaría usar un token diferente, como "Foo_Bar" en lugar de "Foo.Bar". Sin embargo, esta es una gran cantidad de trabajo que requiere conocimiento de PropertyDescriptor
, ICustomTypeDescriptor
y probablemente TypeDescriptionProvider
, y casi con certeza no vale la pena,
La solución más simple es exponer la propiedad como shim / pass-thru:
public string Value2Description {
get {return Value2.Description;} // maybe a null check too
}
A continuación, vincular a "Value2Description", etc.
Si no me equivoco, muestra el resultado de llamar a .ToString () en su subObjeto, por lo que puede anularlo para devolver el contenido de la Descripción.
¿Has intentado solo vincular a Value1.Description? (Supongo que no funciona).
Tengo una clase que se puede usar en lugar de List cuando se vincula, que manejará esto, implementa ITypedList, que permite que una colección proporcione más "propiedades" para sus objetos, incluidas las propiedades calculadas.
Si no surge una solución fácil, publicaré un enlace a mi repositorio más tarde cuando esté en la computadora de mi casa.
Editar : Ok, la versión actual de los archivos que tengo están aquí:
http://code.google.com/p/lvknet/source/browse/#svn/trunk/LVK/Colecciones
Dependiendo de su navegador, recibirá una advertencia o un mensaje de error que diga algo sobre el certificado. La razón es que el certificado no coincide con la url y soy demasiado vago para tratar de descubrir si hay algo que pueda hacer al respecto. Es un repositorio de subversión, por lo que no debería haber nada malicioso, pero las directrices habituales están en vigor.
Necesitará un nombre de usuario y contraseña, ambos son invitados en minúsculas.
Los archivos que desea son los que están cerca de la parte inferior de la lista, TypedList *.
Desafortunadamente (para ti), tiendo a escribir clases y códigos en esa biblioteca de clases al reutilizar otros bits que ya he escrito, por lo que necesitarás descargar los primeros archivos y si no compilan, intenta sacar algo o agarra algunos archivos más. Hay espacios de nombres y más arriba en la jerarquía si los necesita.
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>
lugar de List<T>
y ajusta la propiedad BindableProperties. Tengo algunos cambios en el trabajo, incluido uno que solo crea BindableProperties automáticamente a medida que avanza, pero todavía 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);
No estoy seguro de si es algo como esto lo que buscas ...
Podrías 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;
}
A continuación, vincula el objeto a algo como esto:
<asp:Literal Text=''<%# getSubObject(Eval("Value2")) %>'' runat="server" />