Pergunta

Estou trabalhando com um objeto que possui objetos sub (veja o exemplo abaixo). Estou tentando ligar um List<rootClass> para o datagrid. Quando eu ligo o List<>, na célula que contém o subObject, Eu vejo o seguinte valor ... "namespace.subObject" ... Os valores da string são exibidos corretamente.

Idealmente, gostaria de ver a propriedade de "descrição" do subObject no datacell. Como posso mapear o subObject.Description para mostrar no 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; } }
}
Foi útil?

Solução

Se não me engano, mostra o resultado de chamar .ToString () no seu subobjeto, para que você possa substituir isso para retornar o conteúdo da descrição.

Você já tentou apenas vincular ao valor1.Description? (Acho que não funciona).

Eu tenho uma classe que pode ser usada em vez de listar quando vinculando, que lidará com isso, ele implementa o ITYPEDLIST, o que permite que uma coleção forneça mais "propriedades" para seus objetos, incluindo propriedades calculadas.

A última versão dos arquivos que tenho aqui:

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

Usar:

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

Basicamente você se liga a uma instância de TypedList<T> ao invés de List<T>, e ajuste a propriedade BindableProperties. Eu tenho algumas mudanças no trabalho, incluindo uma que apenas construa o BindableProperties automaticamente à medida que avança, mas ainda não está no porta -malas.

Você também pode adicionar propriedades calculadas, como esta:

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

ou com .NET 3.5:

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

Outras dicas

Já que você mencionou DataGridViewColumn (Tags), presumo que você queira dizer Winforms.

Acessar subpropertas é uma dor; O gerente da moeda está vinculado à lista, portanto, você só tem acesso a propriedades imediatas por padrão; No entanto, você pode superar isso Se você absolutamente precisa usando um descritor de tipo personalizado. Você também precisaria usar um token diferente, como "foo_bar" em vez de "foo.bar". No entanto, este é um formar-se quantidade de trabalho que requer conhecimento de PropertyDescriptor, ICustomTypeDescriptor e provavelmente TypeDescriptionProvider, e quase certamente não vale a pena,

A correção mais simples é expor a propriedade como um Shim / Pass-Thru:

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

Em seguida, vincule -se a "value2Description" etc.

Não tenho certeza se você está usando asp.net, mas se sim, você pode usar uma coluna de modelo e o método avaliar () para exibir valores de objetos aninhados. Por exemplo, para exibir a propriedade Descrição do 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>

Não tenho certeza se é algo assim, você está depois ...

Você pode escrever um 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;
}

Em seguida, vincule o objeto algo assim:

<asp:Literal Text='<%# getSubObject(Eval("Value2")) %>' runat="server" />
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top