none
Bind de Objetos dentro de Objetos

    Pergunta

  • Rapaziada, é o seguinte, na minha aplicação web com framework 3.5 no Visual Studio 2008, tenho um componente DetailsView para cadastrar, alterar e deletar clientes. A propriedade DataSource dele está ligada a um ObjectDataSource que utiliza os quatro comandos (Select, Insert, Update e Delete) com métodos da minha classe da camada de negócio da minha aplicação. O meu método Select, traz uma coleção de objetos "Cliente" (Classe DTO), logo, faço o bind das propriedades desse objeto nos campos do meu DetailsView. Até aqui tudo bem, consigo fazer Bind em quase todos as propriedades desse objeto, exceto uma, a propriedade "Cidade", isso porque ela é um objeto também, ou seja, meu objeto Cliente, guarda un outro objeto (Cidade) na propriedade Cidade. Dessa forma, quando tento fazer um bind no campo cidade do meu DetailsView para a propriedade Cidade do Objeto Cliente não funciona. Bem, funciona em partes, vejam bem, o meu DetailsView tem o modo de visao de apresentação dos dados, onde as informações são apresentadas, aqui eu consigo mostrar usando esse código:

     

    <asp:Label ID="Label1" runat="server" Text='<%# Eval("Cidade.Nome") %>'></asp:Label>

     

    Mas no modo de Edição eu quero usar um DropDownList para o usuário escolher a cidade, no DataSource do DDl usei um outro ObjectDataSource que me traz uma coleção de objetos Cidades, nessa coleção seleciono o atributo Nome cidade para ser mostrado no DDL e o atributo IdCidade para ser armazenado no componente. O problema está aqui, se o atributo que vou guardar no ddl é um código (long), como vou fazer um Bind de um "objeto" Cidade que é o que o DetailsView espera?

     

    Gostaria de tentar resolver esse problema para que minha aplicação fique 100% orientada a Objetos, pois quando tenho que usar objetos que possuem outros objetos nas suas propriedades, não posso usar os meus objetos DTOs e sim trafegar os dados pela aplicação através de DataSets (pois com Datasets consigo fazer o Bind sem problemas, pois trago os campos todos separados no select) e não queria trabalhar com DataSets, somente com Objetos DTOs.

     

    Agradeço a atenção de todos.

    sexta-feira, 1 de agosto de 2008 03:04

Todas as Respostas

  • Ola,

    Você poderia adotar a seguinte estratégia (eu não testei a mesma):

    Code Snippet

    protected void DetailsView1_ModeChanged(object sender, EventArgs e)
    {
        if (this.DetailsView1.CurrentMode == DetailsViewMode.Edit)
        {
            Cliente c = ( Cliente)this.DetailsView1.DataItem;

            ((DropDownList)this.DetailsView1.FindControl("ddlCidades")).SelectedValue = 
                c.CidadeId
        }
    }

     

     

    sexta-feira, 1 de agosto de 2008 13:37
    Moderador
  • Fala ae Israel,

    Obrigado pelo Help, mas não é bem isso que estou querendo. No ex que você usou acima, o c (Objeto Cliente) não possui um atributo CidadeId como você mensionou, e sim um atributo Cidade, neste viría o atributo CidadeId, ficando dessa forma; c.Cidade.CidadeId. Mas mesmo assim não entendo como esse código podería resolver o meu problema, sendo que que o meu drtopdownlist vai me trazer o atributo CidadeId que é um Long e o que eu preciso, é fazer Bind no DetailsView com um atributo Cidade que é um Objeto do tipo Cidade, entende? 

     

    sexta-feira, 1 de agosto de 2008 18:10
  • ???

     

    segunda-feira, 4 de agosto de 2008 11:37
  • Ola,

    Ok, mas se você tem o DDL carregado com as cidades, então você pode recorrer a propriedade SelectedValue para "setar" o valor.

    segunda-feira, 4 de agosto de 2008 11:46
    Moderador
  • Caro Israel,

    Entendi em partes o que você falou. A questão é: Eu tenho um DDL que mostra os nomes das Cidades e guarda o id das mesmas (Isso porque o datasource dele é uma lista de objetos cidades). Eu preciso que este DDL continue mostrando os nomes das cidades, porém, guarde o próprio objeto CIdade em vez de o id. A pergunta: trazendo uma lista de objetos Cidadeseu consigo guardar o objeto inteiro na propriedade SelectedValue ou apenas consigo fuardar uma das propriedades do objeto? Quando clico nas tasks do DDL pra escolher as propriedades onde vou guardas os valores, só aparecem as propriedades do objeto CIdade, já que o datasource do DDL é um objeto cidade, mas não tem nenhuma opção onde eu possa escolher o objeto como um todo entende? Eu preciso dar bind no DetailsView com um objeto Cidade e não o id dele, o meu ObjectDataSource do DetailsView espera um Objeto CIdade não um atributo idCidade.

    Vlw! 

     

    terça-feira, 5 de agosto de 2008 12:43
  • Ola,

    Não, ao contrário do controle ComboBox do Windows Forms, o DropDownList apenas permite o uso do Text e do Value.

    terça-feira, 5 de agosto de 2008 13:42
    Moderador
  • Certo,

    Então como eu faço pra Devolver um "objeto" (não uma propriedade do objeto) Cidade pro meu ObjectDataSource do DetailsView atravéz deo meu DropDownList???

     

    terça-feira, 5 de agosto de 2008 14:31
  • Ola,

    Acho que não estou conseguindo entender. O que o teu objeto traz (nome da cidade?) e o que tem no DropDownList?

    Você quer é posicionar o DropDownList na cidade que está no teu objeto master?

    terça-feira, 5 de agosto de 2008 16:57
    Moderador
  • Isso mesmo Israel

    o meu ObjectDataSource traz um "Objeto", este é um objeto "Cliente". Nesse objeto eu tenho as propriedades: IdCliente(long), NomeCliente(string) e Cidade(Cidade), sendo que a propriedade Cidade é um outro objeto do tipo Cidade. Este ObjectDataSource é o DataSource do meu DetailsView, neste DetailsView, preciso inserir, alterar e Deletar objetos "Cliente". Então eu criei os métodos respectívos na minha camada de negócio. Só que o método de Select ele traz um objeto Cliente e não um DataSet, ou seja, o que vai pro DetailsView é um objeto cliente, até aqui tudo certo. Agora imagine o seguinte: Quando vou no modo de edição do meu DetailsView eu tenho os seguintes campos: idCliente com o id do cliente, no caso 5 por ex. No campo NomeCliente tem o nome do Cliente, no caso João por ex. E no Campo Cidade, aparece assim: Cliente.Cidade. Então o que eu fiz, nas tasks desse controle coloquei o DataBind como: Cliente.Cidade.NomeCIdade. OK funciona, "mas só pra mostrar o nome da cidade", mas se eu quiser por exemplo alterar a cidade vou ter que saber o nome de cabeça? Não! Então coloquei um DropDownList. Ao DDL criei um outro ObjectDataSource que utiliza o método Select na camada de negócio da Classe CIdade, esse método traz uma lista de objetos "Cidade", Então seleciono a propriedade NomeCidade pra ser mostrado pelo DDL e a propriedade IdCidade pra ser armazenado no Value. Blz, o DDL funciona, o problema é que eu criei esse DDL só pra poider alterar a Cidade no modo de edição do meu DetailsView e o ObjectDataSource do DetailsView espera um "Objeto" Cidade e não a propriedade IdCidade que o meu DDL tem guardado no value entende? Quando eu clico no link atualizar no DetailsView eu tenho um erro poi, estoi passando um long(IdCidade) quando o método de atualização espera um objeto(Cidade).

     

    O cenário é esse, o que eu preciso saber é: como eu vou fazer o meu DDL receber no seu value um "objeto" Cidade e não a propriedade IdCidade.

    Deve ter um jeito de eu colocar no value do meu DDL o objeto Cidade que veio no método Select do ObjectDataSource que criei pra ele.  

    E se por acaso não tiver um jeito do DDL guardar um objeto, deve haver uma forma de eu enviar pro método de atualização o objeto que o IdCidade guardado no value do DDL se refere.

    terça-feira, 5 de agosto de 2008 17:41
  • Ola,

    Tente o seguinte:

    Code Snippet

    protected void DetailsView1_ModeChanged(object sender, EventArgs e)
    {
        if (this.DetailsView1.CurrentMode == DetailsViewMode.Edit)
        {
            Cliente c = ( Cliente)this.DetailsView1.DataItem;

            ((DropDownList)this.DetailsView1.FindControl("ddlCidades")).SelectedValue =
                this.DropDownList1.Items.FindByText( c.Cidade.NomeCidade).Value;
        }
    }

     

     

    terça-feira, 5 de agosto de 2008 17:48
    Moderador