none
DUVIDA -> Alterar propriedades de vários UserControl dinamicamente (Windows Forms) RRS feed

  • Pergunta

  • Olá bom dia tenho um um componente criado por mim onde neste tenho algumas propriedades e adicionei varios deste em um form e minha duvida é: como posso acessar as propriedades deste usercontrol usando esse código? 

    Dim ii, intIdx As Integer
            intIdx = 0
            ii = intIdx
            For i = ii To Me.Controls.Count - 1
                If TypeOf Me.Controls.Item(i) Is ProjetoAutomacao.ctrlDisplayLCD And Me.Controls.Item(i).Tag = eId.ToString Then
    
                    Me.Controls.Item(i).IdentificadorEquipamento = eIdentificadorCaixa
                    Me.Controls.Item(i).IdentificadorSensor = eIdentificadorSensor
                    Me.Controls.Item(i).NomeSensor = eDescricao
                    Me.Controls.Item(i).ValorSensor = eValor.ToString
                    Me.Controls.Item(i).GrandezaFisica = eGrandezaFisica
                    If (eValor > 0) Then
                        Me.Controls.Item(i).SinalValorSensor = "+"
                    Else
                        Me.Controls.Item(i).SinalValorSensor = "-"
                    End If
                End If
            Next
    Desde já obrigado!


    Fernando Fernandes skype: cbdesousa

    segunda-feira, 16 de setembro de 2013 14:27

Respostas

  • Olá!

    Pelo que eu entendi do seu problema, acredito eu que o directcast vai liberar o acesso as propriedades do seu componente.

    Tenta assim:

    For Each controle As Control In Me.Controls
                                If TypeOf controle Is ctrlDisplayLCD Then
                                    Dim meuControle As ctrlDisplayLCD = DirectCast(controle, ctrlDisplayLCD)
                                    If meuControle.Tag = eId.tostring Then
                                        controle.identificadorEquipamento = eIdentificadorEquipamento
                                    End If
                                End If
                            Next

    Eu fiz ele reduzido apenas para vc testar. E por favor verifique se as suas variáveis estão corretas, pois eu fui copiando da imagem e posso ter cometido alguns erros de digitação.

    No for each, vc não precisa se preocupar com o contador de controles, pois ele vai percorrer todos os controles existentes automaticamente.

    Att.

    Giovani

    terça-feira, 17 de setembro de 2013 13:51

Todas as Respostas

  • Bom dia amigo!

    Vc disse que criou seu próprio componente certo? Esse seu componente vc derivou de algum já existente?

    Por exemplo eu crio novos componentes para meus sistemas baseados em componentes padrões do VB.net. Alguns são apenas extensões e outros são junções de 2 ou mais em um único componente.

    Em ambos os casos é possível acessar as informações ou propriedades em runtime.

    Quando um componente é apenas estendido, sem possuir outros tipos de componentes nele, o acesso as propriedades em runtime não difere do componente normal. A única diferença seria o número maior de opções para acessar.

    Já no caso de componentes que se originaram da junção de 2 ou mais, vc pode acessar toda a gama de opções de todos os agora subcomponentes do componente que vc criou. Para isso basta referenciar o nome do componente que vc deu na hora de criá-lo. Por padrão do vb, os nomes geralmente são "componente1".

    Ex: Criei um controle que contem um checkbox e um picturebox. Chamei esse controle de checkpickbox.

    Para carregar uma imagem no checkpickbox, eu preciso acessar da seguinte forma: checkpickbox1.picturebox1.imagelocation = "c:\minhafoto.jpg"

    Já no caso do seu laço de repetição para alterar as propriedades, eu uso um parecido para limpar os formulários de cadastro quando o usuário clica no botão novo registro. Veja:

    Public Function ClearForm(ByVal sForm As Form) As Boolean
            Try
                Dim controle As Control
    
                For Each controle In sForm.Controls
                    If TypeOf controle Is GroupBox Then
                        If controle.Tag = "A" Then 'A de APAGAR. Qdo for N, não apaga, pois existe um botão específico para aquele grupo.
                            Dim controle2 As Control
                            For Each controle2 In controle.Controls
                                If TypeOf controle2 Is TextBox Then
                                    controle2.Text = ""
                                ElseIf TypeOf controle2 Is ComboBox Then
                                    controle2.Text = ""
                                End If
                            Next
                        End If
                    End If
                Next
                Return True
            Catch ex As Exception
                Return False
            End Try
        End Function

    Neste laço de repetição, eu consigo acessar as informações básicas dos componentes textbox, combobox, dentro de um container, que pode ser tanto o formulário quando um groupbox, panel, etc.

    Também existe a necessidade, as vezes, de ter um acesso mais completo ao componente em um laço de repetição.

    Por exemplo no meu componente checkpickbox, eu tenho uma tela de gerenciamento de imagens e quando o usuário clica no botão selecionar todas as imagens, eu faço o seguinte laço de repetição para dar o valor true para os checkbox do componente:

    For Each controle As Control In Panel1.Controls
                If TypeOf controle Is CheckPicBox Then
                    Dim meuControle As CheckPicBox = DirectCast(controle, CheckPicBox)
                    meuControle.CheckBox.Checked = True
                End If
            Next

    O directcast permite que eu mude o estado do checkbox dentro do laço de repetição. Caso vc tenha mais interesse em estudar esse cara, leia esses links: macoratti, msdn

    Desculpe ter me alongado demais na resposta. Espero que eu tenha conseguido pelo menos lhe dar um norte para conseguir resolver seu problema.

    Att.

    Giovani

    terça-feira, 17 de setembro de 2013 10:57
  • Giovani Primeiramente obrigado pela resposta. 

    Então no meu caso criei esse user control usando label's e com isso implementei novas propriedades para este componente e com isso mudo a propriedade text de cada label.

    Segue algumas imagens para exemplo!

     



    Fernando Fernandes skype: cbdesousa

    terça-feira, 17 de setembro de 2013 13:33
  • No form onde preciso usar esse componente que criei insiro n componentes ao form

    E estou com esse problema não consigo chegar até a propriedade que criei usando Controls.Item()


    Fernando Fernandes skype: cbdesousa

    terça-feira, 17 de setembro de 2013 13:35
  • Olá!

    Pelo que eu entendi do seu problema, acredito eu que o directcast vai liberar o acesso as propriedades do seu componente.

    Tenta assim:

    For Each controle As Control In Me.Controls
                                If TypeOf controle Is ctrlDisplayLCD Then
                                    Dim meuControle As ctrlDisplayLCD = DirectCast(controle, ctrlDisplayLCD)
                                    If meuControle.Tag = eId.tostring Then
                                        controle.identificadorEquipamento = eIdentificadorEquipamento
                                    End If
                                End If
                            Next

    Eu fiz ele reduzido apenas para vc testar. E por favor verifique se as suas variáveis estão corretas, pois eu fui copiando da imagem e posso ter cometido alguns erros de digitação.

    No for each, vc não precisa se preocupar com o contador de controles, pois ele vai percorrer todos os controles existentes automaticamente.

    Att.

    Giovani

    terça-feira, 17 de setembro de 2013 13:51