Usuário com melhor resposta
DUVIDA -> Alterar propriedades de vários UserControl dinamicamente (Windows Forms)

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
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
- Marcado como Resposta Fernando Fernandes de Sousa quarta-feira, 18 de setembro de 2013 14:29
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
-
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
-
-
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
- Marcado como Resposta Fernando Fernandes de Sousa quarta-feira, 18 de setembro de 2013 14:29