none
Como implementar uma coleção de objetos em um UserControl? RRS feed

  • Pergunta

  • Boa tarde, pessoal!

    Tenho um UserControl chamando Prancha com algumas propriedades definidas e nele também tenho um Panel no qual eu preciso inserir, em tempo de execução, vários objetos do tipo Camada que também é um UserControl. Todo o processo eu tenho feito manualmente, calculando as posições das Camadas, entre outras configurações de Design, antes de poder inserir ele no Panel do controle Prancha, o que têm acarretado muita lentidão.

    Eu gostaria de configurar os dois UserControls (Prancha e Camada) de modo que eu insira o controle Prancha em um formulário e ele me disponibilize a propriedade para inserir, editar e remover os controles Camadas como eu bem entender. A estrutura é semelhante com a de um ListBox.

    Como eu poderia fazer isso?

    Aguardo resposta...

    segunda-feira, 4 de setembro de 2017 20:16

Respostas

  • Eric,

    Sobre o item 1, pra Windows forms não há grandes opções nesse sentido, talvez em WPF que é uma tecnologia mais nova, com opções mais ricas de layout, haja algo melhor. Em Windows Form, a opção é usar os métodos pra enviar pra trás e pra frente:

    https://docs.microsoft.com/en-us/dotnet/framework/winforms/controls/how-to-layer-objects-on-windows-forms

    Sobre o item 2, até dei uma pesquisada aqui mas não vi nada de muito produtivo. Tem muitas formas de comprimir uma imagem pra salvar, mas o seu caso é mais complicado, pois você precisa delas abertas. Uma alternativa se elas não ficarem visíveis o tempo todo (pelo seu mecanismo de abas) é serializar as que não estão visíveis para o disco de forma que você não 'gaste' memória com imagens que não precisa mostrar naquele instante.


    ​Rafael Esquiçato Professional Scrum Master MCP, MCTS

    A minha aplicação gera e lê arquivos baseados em xml pra armazenar as informações incluindo as imagens convertidas para base64. Para resolver a questão da lentidão ao armazenar as imagens em memória eu passei a armazenar as strings base64 das imagens e converter para imagem apenas quando eu precisar visualiza-las ou utilizadas. O desempenho melhorou cerca de 85%.

    • Marcado como Resposta EricJhon92 quinta-feira, 14 de setembro de 2017 20:56
    quinta-feira, 14 de setembro de 2017 20:56

Todas as Respostas

  • Eric bom dia,

    Já pensou em usar o Repeater? Ele é um componente que recebe um datasource (pode ser sua lista de DTOs representado a definição das camadas e suas propriedades) e um template onde você pode adicionar os controles e o layout da forma que quiser. Não é um grid que é obrigatoriamente colunar, aqui o template é livre, você poderia adicionar o seu usercontrol Camada e ainda fazer o bind das propriedades como ele.

    https://imasters.com.br/framework/dotnet/trabalhando-com-repeater-no-asp-net/?trace=1519021197&source=single


    ​Rafael Esquiçato Professional Scrum Master MCP, MCTS

    terça-feira, 5 de setembro de 2017 12:43
  • Eric bom dia,

    Já pensou em usar o Repeater? Ele é um componente que recebe um datasource (pode ser sua lista de DTOs representado a definição das camadas e suas propriedades) e um template onde você pode adicionar os controles e o layout da forma que quiser. Não é um grid que é obrigatoriamente colunar, aqui o template é livre, você poderia adicionar o seu usercontrol Camada e ainda fazer o bind das propriedades como ele.

    https://imasters.com.br/framework/dotnet/trabalhando-com-repeater-no-asp-net/?trace=1519021197&source=single


    ​Rafael Esquiçato Professional Scrum Master MCP, MCTS

    Eu to trabalhando em vb.net, pelo que vi essa ferramenta é só pra ASP.NET :-/
    sexta-feira, 8 de setembro de 2017 17:05
  • Segue um print do projeto:

    Eu gostaria que ele trabalhasse dessa forma, sem consumir tanta memória (só esse projeto consome 500mb de ram). Alguém poderia verificar o código pra mim?

    Link do projeto: https://mega.nz/#F!JRoEiZjQ!oQNexOTVolMw2imm4onw8g

    O objetivo é inserir esse controle Prancha em uma tabpage de acordo com o número de pranchas que o usuário desejar.

    Obs: Esse aplicativo trabalha com imagens de altíssima qualidade.

    Aguardo retorno

    sábado, 9 de setembro de 2017 02:41
  • Ola Eric,

    Tudo bem, não estava claro que era Windows Forms. A parte boa é pra Windows Forms é até mais simples. Basicamente basta você adicionar os controles ao form usando a propriedade Controls e o método Add:

    Dim controle As New Camada()

    controle.Propriedade1 = "ABC"

    controle.Propriedade2 = "ABC"

    controle.OnEvento += EventHandler;

    controlePai.Controls.Add(controle);

    Acima um exemplo de como instanciar um controle, setar propriedades, definir um event handler e adicionar ao projeto. O controlePai no caso é onde você vai adicionar os seus controles dinamicamente, você pode adicionar ao form direto, mas ai você fica uma referencia de posicionamento, teria que trabalhar sempre com posicionamento absoluto, mexer com camadas, não é legal. Como você tem um MultTab, pode, dentro das tabs, colocar um Panel e nele ir adicionando as camadas.

    https://support.microsoft.com/pt-br/help/319266/how-to-programmatically-add-controls-to-windows-forms-at-run-time-by-u

    Esse artigo em C# explica o processo, sei que seu código é em VB, mas o código é simples e imagino que vai ajudar.


    ​Rafael Esquiçato Professional Scrum Master MCP, MCTS

    sábado, 9 de setembro de 2017 12:43
  • Ola Eric,

    Tudo bem, não estava claro que era Windows Forms. A parte boa é pra Windows Forms é até mais simples. Basicamente basta você adicionar os controles ao form usando a propriedade Controls e o método Add:

    Dim controle As New Camada()

    controle.Propriedade1 = "ABC"

    controle.Propriedade2 = "ABC"

    controle.OnEvento += EventHandler;

    controlePai.Controls.Add(controle);

    Acima um exemplo de como instanciar um controle, setar propriedades, definir um event handler e adicionar ao projeto. O controlePai no caso é onde você vai adicionar os seus controles dinamicamente, você pode adicionar ao form direto, mas ai você fica uma referencia de posicionamento, teria que trabalhar sempre com posicionamento absoluto, mexer com camadas, não é legal. Como você tem um MultTab, pode, dentro das tabs, colocar um Panel e nele ir adicionando as camadas.

    https://support.microsoft.com/pt-br/help/319266/how-to-programmatically-add-controls-to-windows-forms-at-run-time-by-u

    Esse artigo em C# explica o processo, sei que seu código é em VB, mas o código é simples e imagino que vai ajudar.


    ​Rafael Esquiçato Professional Scrum Master MCP, MCTS

    Entendi. É mais ou menos o que eu já tenho feito. Mas eu ainda tenho duas dúvidas:

    1. É possível sobrepor a coleção controlcollection do Panel por uma coleção personalizada de layers? algo como MeuPainel.LayerCollection?

    2. Como eu faço para armazenar as imagens de alta resolução na memória sem consumir tanta memória? Cada layer/camada precisa armazenar uma imagem de alta resolução vinda de uma string base64. Esse tem sido meu maior desafio, pois se um projeto feito nessa minha aplicação contiver muitas pranchas com vários layers/camadas o pc irá travar com certeza, como já aconteceu em testes que eu fiz. (Obs.: fiz um teste com o abrindo todas a mesma quantidade de imagens em alta resolução no photoshop e ele mantém um consumo razoável de memória, diferentemente do meu aplicativo que chega a consumir bastante memória)

    sábado, 9 de setembro de 2017 13:15
  • Eric,

    Sobre o item 1, pra Windows forms não há grandes opções nesse sentido, talvez em WPF que é uma tecnologia mais nova, com opções mais ricas de layout, haja algo melhor. Em Windows Form, a opção é usar os métodos pra enviar pra trás e pra frente:

    https://docs.microsoft.com/en-us/dotnet/framework/winforms/controls/how-to-layer-objects-on-windows-forms

    Sobre o item 2, até dei uma pesquisada aqui mas não vi nada de muito produtivo. Tem muitas formas de comprimir uma imagem pra salvar, mas o seu caso é mais complicado, pois você precisa delas abertas. Uma alternativa se elas não ficarem visíveis o tempo todo (pelo seu mecanismo de abas) é serializar as que não estão visíveis para o disco de forma que você não 'gaste' memória com imagens que não precisa mostrar naquele instante.


    ​Rafael Esquiçato Professional Scrum Master MCP, MCTS

    • Marcado como Resposta Filipe B CastroModerator segunda-feira, 11 de setembro de 2017 16:40
    • Não Marcado como Resposta EricJhon92 quinta-feira, 14 de setembro de 2017 20:56
    domingo, 10 de setembro de 2017 16:05
  • Eric,

    Sobre o item 1, pra Windows forms não há grandes opções nesse sentido, talvez em WPF que é uma tecnologia mais nova, com opções mais ricas de layout, haja algo melhor. Em Windows Form, a opção é usar os métodos pra enviar pra trás e pra frente:

    https://docs.microsoft.com/en-us/dotnet/framework/winforms/controls/how-to-layer-objects-on-windows-forms

    Sobre o item 2, até dei uma pesquisada aqui mas não vi nada de muito produtivo. Tem muitas formas de comprimir uma imagem pra salvar, mas o seu caso é mais complicado, pois você precisa delas abertas. Uma alternativa se elas não ficarem visíveis o tempo todo (pelo seu mecanismo de abas) é serializar as que não estão visíveis para o disco de forma que você não 'gaste' memória com imagens que não precisa mostrar naquele instante.


    ​Rafael Esquiçato Professional Scrum Master MCP, MCTS

    A minha aplicação gera e lê arquivos baseados em xml pra armazenar as informações incluindo as imagens convertidas para base64. Para resolver a questão da lentidão ao armazenar as imagens em memória eu passei a armazenar as strings base64 das imagens e converter para imagem apenas quando eu precisar visualiza-las ou utilizadas. O desempenho melhorou cerca de 85%.

    • Marcado como Resposta EricJhon92 quinta-feira, 14 de setembro de 2017 20:56
    quinta-feira, 14 de setembro de 2017 20:56