none
user control c# windows com problemas RRS feed

  • Pergunta

  • Boa tarde amigos.

    Estou fazendo uma biblioteca de componentes .net que a microsoft não tem.

    um destes componentes seria um controle com dois controles (label e combobox).

    Fiz uma propriedade para poder alterar o tamanho da combo e ajusta-la ao conteúdo.

    a combo também tem dock para direita para alinhar de acordo com o size do controle.

    O controle funciona normalmente.

    O problema é que eu altero a propriedade do tamanho da combo por ex: para 200 ( o controle muda normalmente) - propriedate tamanho_texto.

    Se eu fechar e abrir o projeto novamente, o combo fica desconfigurado (com size.weight diferente dos 200 que eu coloquei).

    Segue o código:

    using System;
    using System.ComponentModel;
    using System.Drawing;
    using System.Data;
    using System.Windows.Forms;
    
    namespace sistematica.extends.controls
    {
        public partial class ComboBoxExtends : UserControl
        {
            int tamanho;
    
            private void Inicializar()
            {
                this.cbo_action.Font = new Font("Microsoft Sans Serif", 9F, FontStyle.Regular);
                if (cbo_action.Items.Count > 0)
                    cbo_action.SelectedIndex = 0;
            }
    
            #region propriedades
    
            [Category("Custom")]
            [Description("Tamanho do controle")]
            public int Tamanho
            {
                get
                {
                    return this.Width;
                }
    
                set
                {
                    this.Width = value;
                }
            }
    
            [Category("Custom")]
            [Description("Texto da label")]
            public String Titulo
            {
                get
                {
                    return lbl_action.Text;
                }
    
                set
                {
                    lbl_action.Text = value;
                }
            }
    
            [Category("Custom")]
            [Description("Tamanho de texto")]
            public int Tamanho_Texto
            {
                get
                {
                    //return cbo_action.Size.Width;
                    return tamanho; 
                }
    
                set
                {
                    tamanho = value;
                    update(tamanho);
                    //cbo_action.Size = new System.Drawing.Size(value, 25);
                }
            }        
    
            [Category("Custom")]
            [Description(""),
             DesignerSerializationVisibility(DesignerSerializationVisibility.Content),
             Editor("System.Windows.Forms.Design.StringCollectionEditor, System.Design", typeof(System.Drawing.Design.UITypeEditor))]
            public System.Windows.Forms.ComboBox.ObjectCollection Items
            {
                get
                {
                    return this.cbo_action.Items;
                }
            }
    
    
            #endregion
    
            #region metodos
    
            public void update(int valor)
            {
                this.cbo_action.Size = new Size(valor, 25);
            }
    
            #endregion
    
            public ComboBoxExtends()
            {
                InitializeComponent();
                            
            }
    
            private void ComboBoxExtends_Load(object sender, EventArgs e)
            {
                Inicializar();
            }
        }
    }



    Alguém poderia me ajudar?

    Obrigado por enquanto.





    • Editado Fernando.Jarcen terça-feira, 3 de maio de 2016 20:03
    • Editado Marcos SJ quarta-feira, 4 de maio de 2016 12:50 Edição
    terça-feira, 3 de maio de 2016 19:45

Respostas

  • Beleza Fernando.Jarcen,

    Então deixa eu ver se eu entendi. Você criou um controle que é um agrupamento de um ComboBox e uma Label. Você criou uma propriedade tamanho_texto pra esse controle customizado que deve definir o tamanho do ComboBox. Quando você criar um novo controle desse tipo, setando a propriedade tamanho_texto para um valor específico, digamos, 200, salva o projeto, fecha o VS, e abre de novo, o tamanho está alterado. 

    Qual o tamanho novo? Já rverificou alguma propriedade de tamanho padrão dos elementos nativos? Vou achar aqui oa rtigo que li sobre isso e te mando na sequência.

    Obrigado,

    • Marcado como Resposta Marcos SJ segunda-feira, 16 de maio de 2016 14:36
    quarta-feira, 11 de maio de 2016 14:47
  • Amigos.

    Tive uma idéia que ajudou a solucionar o problema definitivamente.

    Baseado que, todas as propriedades tem que ser inicializadas antes de serem utilizadas, criei um componente de teste que funciona da seguinte forma.

    Como no exemplo acima, é um usercontrol com dois componentes label e combo respectivamente lbl_action e cbo_action.

    ao criar uma instancia da classe do componente, eu criei uma rotina para criar os dois componentes via código.

    em seguida defino o tamanho do usercontrol

    e por ultimo fiz a atualização da propriedade da combo.

            public cbo_teste()
            {
                Inicializar();
                this.Size = new Size(150, 23);
                atualiza();
            }

    Testei e funcionou em várias ocasiões fechando e abrindo o VS.

    Vejam o que acham.

        public class cbo_teste : UserControl
        {
            Label lbl_action = new Label();
            ComboBox cbo_action = new ComboBox();

            #region Propriedades

            public cbo_teste()
            {
                Inicializar();
                this.Size = new Size(150, 23);
                atualiza();
            }


            [Category("Custom")]
            [Description("Tamanho do controle")]
            public int Tamanho
            {
                get
                {
                    return this.Width;
                }

                set
                {
                    this.Width = value;
                }
            }

            [Category("Custom")]
            [Description("Texto da label")]
            public String Titulo
            {
                get
                {
                    return this.lbl_action.Text;
                }

                set
                {
                    this.lbl_action.Text = value;
                }
            }


            [Category("Custom")]
            [Description("Tamanho de texto")]
            public int Tamanho_Texto
            {
                get
                {
                    return this.cbo_action.Size.Width;
                }

                set
                {
                    this.cbo_action.Size = new System.Drawing.Size(value, 25);
                }
            }


            #endregion



            private void Inicializar()
            {
                lbl_action.Font = new Font("Microsoft Sans Serif", 9F, FontStyle.Regular);
                lbl_action.Text = "teste";
                lbl_action.AutoSize = true;

                cbo_action.DropDownStyle = ComboBoxStyle.DropDown;
                cbo_action.Font = new Font("Microsoft Sans Serif", 9F, FontStyle.Regular);
                cbo_action.Dock = DockStyle.Right;

                this.Controls.Add(lbl_action);
                this.Controls.Add(cbo_action);
            }

            private void atualiza()
            {
                cbo_action.Size = new Size(this.Tamanho_Texto, 25);
            }

    Abs

    • Marcado como Resposta Marcos SJ quarta-feira, 18 de maio de 2016 13:22
    terça-feira, 17 de maio de 2016 18:35

Todas as Respostas

  • Bom dia Fernando.Jarcen,

    Talvez não seja exatamente isto mas acredito que você talvez possa tirar proveito do conceito destas situações:

    http://stackoverflow.com/questions/18542954/why-do-controls-in-the-winforms-designer-resize-on-their-own

    http://stackoverflow.com/questions/27485481/visual-studio-form-designer-changes-layout-when-reopened-because-of-minimumsize

    Atenciosamente


    Marcos SJ

    Esse conteúdo e fornecido sem garantias de qualquer tipo, seja expressa ou implícita

    MSDN Community Support

    Por favor, lembre-se de Marcar como Resposta as postagens que resolveram o seu problema. Essa é uma maneira comum de reconhecer aqueles que o ajudaram e fazer com que seja mais fácil para os outros visitantes encontrarem a resolução mais tarde.


    • Editado Marcos SJ quarta-feira, 4 de maio de 2016 13:05
    quarta-feira, 4 de maio de 2016 13:05
  • Marcos.

    Eu testei mas não funcionou.

    Percebi que quando ele abre o visual studio, o tamanho do controle é atribuído ao controle filho.

    Não sei se ele pega um tamanho default do combo e sobreescreve o tamanho que foi definido na propriedade Tamanho_Texto.

    Você sabe como eu consigo ver isso?

     

    quinta-feira, 5 de maio de 2016 20:15
  • Opa, tudo bom Fernando.Jarcen?

    Porque tem linhas comentadas na propriedade Tamanho_texto? O que é o objeto cbo_action? Qual o problema exatamente? Em que momento que muda o tamanho do elemento? Ou logo que você o cria ele já tem o tamanho diferente do que o definido pelo código?

    Obrigado,

    segunda-feira, 9 de maio de 2016 17:01
  • Olá.

    A propriedade tamanho_texto é a propriedade que deve mudar o tamanho da combobox cbo_action.

    O controle é composto de uma label e uma combobox.

    O intuito é utilizar o controle com os dois controles embutidos e, poder aumentar ou diminuir o tamanho da combobox para que eu consiga alinhar com os demais controles do form.

    eu até consigo fazer isso através da propriedade tamanho_texto que altera o tamanho da combo para alinhar tanto a direita como na esquerda.

    O problema ocorre porque eu defino a propriedade por ex, para 200. e o controle é alterado normalmente.

    Mas quando eu abro o visual studio novamente, o controle está com outro tamanho mesmo se a propriedade for 200.

    eu queria criar o controle com os dois componentes e a combo manter o tamanho independente de fechar e reabrir o visual studio.

    Obrigado pelo apoio.

    segunda-feira, 9 de maio de 2016 19:58
  • Beleza Fernando.Jarcen,

    Então deixa eu ver se eu entendi. Você criou um controle que é um agrupamento de um ComboBox e uma Label. Você criou uma propriedade tamanho_texto pra esse controle customizado que deve definir o tamanho do ComboBox. Quando você criar um novo controle desse tipo, setando a propriedade tamanho_texto para um valor específico, digamos, 200, salva o projeto, fecha o VS, e abre de novo, o tamanho está alterado. 

    Qual o tamanho novo? Já rverificou alguma propriedade de tamanho padrão dos elementos nativos? Vou achar aqui oa rtigo que li sobre isso e te mando na sequência.

    Obrigado,

    • Marcado como Resposta Marcos SJ segunda-feira, 16 de maio de 2016 14:36
    quarta-feira, 11 de maio de 2016 14:47

  • Bom dia,

    Por falta de retorno, esta thread será encerrada.

    Caso seja necessário, por gentileza, abra uma nova thread.

    Atenciosamente


    Marcos SJ

    Esse conteúdo e fornecido sem garantias de qualquer tipo, seja expressa ou implícita

    MSDN Community Support

    Por favor, lembre-se de Marcar como Resposta as postagens que resolveram o seu problema. Essa é uma maneira comum de reconhecer aqueles que o ajudaram e fazer com que seja mais fácil para os outros visitantes encontrarem a resolução mais tarde.

    segunda-feira, 16 de maio de 2016 14:36
  • ok, estou no aguardo do artigo.

    Desculpe-me, não fui notificado da sua resposta.

    terça-feira, 17 de maio de 2016 02:44
  • Verifiquei por exemplo que coloco na propriedade 220 e fecho o VS. Quando eu abro novamente ele aparece com outros valores totalmente diferentes. não são valores repetidos, em alguns aparecem 2520 em outros 350. Verifiquei também que ele coloca esse valor no arquivo Design.

    Se eu editar o valor no arquivo.design, quando eu entro no modo design do formulário ele retorna aquele valor estranho de novo ou seja, não guarda o valor que eu coloco na propriedade.

    pode ser algum evento de visualização de formulário que executa automaticamente no VS?

    terça-feira, 17 de maio de 2016 02:48
  • Boa tarde amigos.

    Estou fazendo uma biblioteca de componentes .net que a microsoft não tem.

    um destes componentes seria um controle com dois controles (label e combobox).

    Fiz uma propriedade para poder alterar o tamanho da combo e ajusta-la ao conteúdo.

    a combo também tem dock para direita para alinhar de acordo com o size do controle.

    O controle funciona normalmente.

    O problema é que eu altero a propriedade do tamanho da combo por ex: para 200 ( o controle muda normalmente) - propriedate tamanho_texto.

    Se eu fechar e abrir o projeto novamente, o combo fica desconfigurado (com size.weight diferente dos 200 que eu coloquei).

    A propriedade tamanho_texto é a propriedade que deve mudar o tamanho da combobox cbo_action.

    O controle é composto de uma label e uma combobox.

    O intuito é utilizar o controle com os dois controles embutidos e, poder aumentar ou diminuir o tamanho da combobox para que eu consiga alinhar com os demais controles do form.

    eu até consigo fazer isso através da propriedade tamanho_texto que altera o tamanho da combo para alinhar tanto a direita como na esquerda.

    O problema ocorre porque eu defino a propriedade por ex, para 200. e o controle é alterado normalmente.

    Mas quando eu abro o visual studio novamente, o controle está com outro tamanho mesmo se a propriedade for 200.

    eu queria criar o controle com os dois componentes e a combo manter o tamanho independente de fechar e reabrir o visual studio.

    Obrigado pelo apoio

    thread relacionada https://social.msdn.microsoft.com/Forums/pt-BR/43ff099c-bd6f-4e14-b57a-0def0e27bd8d/user-control-c-windows-com-problemas?forum=vscsharppt


    • Editado Fernando.Jarcen terça-feira, 17 de maio de 2016 12:38
    • Mesclado Marcos SJ terça-feira, 17 de maio de 2016 14:53 Duplicata
    terça-feira, 17 de maio de 2016 12:37
  • Amigos.

    Em .net para web, ao criar um controle composto, o mesmo deve ser do tipo composite control.

    Para Desktop seguiria o mesmo raciocínio?

    terça-feira, 17 de maio de 2016 17:22
  • Amigos.

    Tive uma idéia que ajudou a solucionar o problema definitivamente.

    Baseado que, todas as propriedades tem que ser inicializadas antes de serem utilizadas, criei um componente de teste que funciona da seguinte forma.

    Como no exemplo acima, é um usercontrol com dois componentes label e combo respectivamente lbl_action e cbo_action.

    ao criar uma instancia da classe do componente, eu criei uma rotina para criar os dois componentes via código.

    em seguida defino o tamanho do usercontrol

    e por ultimo fiz a atualização da propriedade da combo.

            public cbo_teste()
            {
                Inicializar();
                this.Size = new Size(150, 23);
                atualiza();
            }

    Testei e funcionou em várias ocasiões fechando e abrindo o VS.

    Vejam o que acham.

        public class cbo_teste : UserControl
        {
            Label lbl_action = new Label();
            ComboBox cbo_action = new ComboBox();

            #region Propriedades

            public cbo_teste()
            {
                Inicializar();
                this.Size = new Size(150, 23);
                atualiza();
            }


            [Category("Custom")]
            [Description("Tamanho do controle")]
            public int Tamanho
            {
                get
                {
                    return this.Width;
                }

                set
                {
                    this.Width = value;
                }
            }

            [Category("Custom")]
            [Description("Texto da label")]
            public String Titulo
            {
                get
                {
                    return this.lbl_action.Text;
                }

                set
                {
                    this.lbl_action.Text = value;
                }
            }


            [Category("Custom")]
            [Description("Tamanho de texto")]
            public int Tamanho_Texto
            {
                get
                {
                    return this.cbo_action.Size.Width;
                }

                set
                {
                    this.cbo_action.Size = new System.Drawing.Size(value, 25);
                }
            }


            #endregion



            private void Inicializar()
            {
                lbl_action.Font = new Font("Microsoft Sans Serif", 9F, FontStyle.Regular);
                lbl_action.Text = "teste";
                lbl_action.AutoSize = true;

                cbo_action.DropDownStyle = ComboBoxStyle.DropDown;
                cbo_action.Font = new Font("Microsoft Sans Serif", 9F, FontStyle.Regular);
                cbo_action.Dock = DockStyle.Right;

                this.Controls.Add(lbl_action);
                this.Controls.Add(cbo_action);
            }

            private void atualiza()
            {
                cbo_action.Size = new Size(this.Tamanho_Texto, 25);
            }

    Abs

    • Marcado como Resposta Marcos SJ quarta-feira, 18 de maio de 2016 13:22
    terça-feira, 17 de maio de 2016 18:35