• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

Feanorsoul

TextBox em RunTime

12 mensagens neste tópico

Olá outra vez.

Quem faz uma pergunta faz duas. O que se passa é o seguinte:

Preciso de criar algumas TextBox em RunTime de forma a que seja possível recolher a informação que o utilizador introduzir nelas e juntar tudo numa String. A criação das TextBox já consegui por a funcionar:

For i As Integer = 1 To numero_de_dias_detrabalho
            Dim TextBoxHorario As New TextBox()

            Dim StringGravacaoDoDia As String = ""

            'gera textbox para inserir horario--------------------------------------------------------------------------------------->
            TesteFor.Controls.Add(TextBoxHorario)
            TextBoxHorario.Top = LabelDia.Top + 25
            TextBoxHorario.Left = 100
            TextBoxHorario.Name = "TextBoxHorario" + CStr(i)

Pergunto ao utilizador quantos dias de trabalho e tal e consoante o numero gero as TextBox necessárias automaticamente. O problema é que para recolhera informação dessas mesmas caixas não consigo aceder ao campo TextBoxHorario.Name = "TextBoxHorario" + CStr(i) de uma função exterior, e não tenho outra forma de criar as TextBox. Alguém tem alguma ideia de como fazer isto. Tou sem ideias.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Experimenta somente assim TextBoxHorario.Name = "TextBoxHorario" + i

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O mais fácil penso que será criar um nome de incremento, como aliás já estás a fazer, para facilitar a identificação das textboxes quando utilizares um ciclo por todos os controlos adicionados ao container.

TesteFor.Controls é uma colecção de Object com todos os controlos. Só tens de verificar o tipo, depois o nome, convertes o tipo para que ganhes as propriedades no Intellisense e tens o que precisas.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Eu já fiz uma coisa parecida, mas com botões e PictureBox.

    Dim NCircuitos As Integer = 116
    Friend Ordem(NCircuitos) As Button
    Friend Estado(NCircuitos) As PictureBox
' ...
        'Desenho dos botões de controlo da instalação
        Dim MyGroupBox As New GroupBox
        With MyGroupBox
            .Name = "Circuitos"
            .Width = 480
            .Height = 620
            .Left = 10
            .Top = 30
            .Text = "Comando e Estado dos circuitos de iluminação"
        End With
        Me.Controls.Add(MyGroupBox)
        For i As Integer = 0 To 9
            For j As Integer = 0 To 11
                Dim circ As Integer
                'circ = (i + 1) + j * 10
                circ = i + j * 10
                If (circ) < NCircuitos Then
                    Ordem(circ) = New Button
                    Estado(circ) = New PictureBox
                    With Ordem(circ)
                        .Name = "B" & circ.ToString
                        .Width = 38
                        .Height = 23
                        .Left = 20 + i * 45
                        .Top = 40 + j * 50
                        .BackColor = Color.Black
                        .ForeColor = Color.White
                        .Text = (circ + 1).ToString
                    End With
                    With Estado(circ)
                        .Name = "E" & circ.ToString
                        .Width = 34
                        .Height = 17
                        .Left = 22 + i * 45
                        .Top = 20 + j * 50
                        .BackColor = Color.Gray
                    End With
                    MyGroupBox.Controls.Add(Ordem(circ))
                    MyGroupBox.Controls.Add(Estado(circ))
                    AddHandler Ordem(circ).Click, AddressOf MyButton_Click
                End If
            Next
        Next
' ...
        For i As Integer = 0 To (NCircuitos - 1)
            Select Case Estados(i)
                Case -1
                    Estado(i).BackColor = Color.Blue
                    Ordem(i).BackColor = Color.Blue
                    Ordem(i).ForeColor = Color.White
                Case 0
                    Estado(i).BackColor = Color.Black
                    Ordem(i).BackColor = Color.Black
                    Ordem(i).ForeColor = Color.White
                Case 1
                    Estado(i).BackColor = Color.Green
                    Ordem(i).ForeColor = Color.Black
                    Ordem(i).BackColor = Color.Yellow
                Case Else
                    Estado(i).BackColor = Color.Red
                    Ordem(i).ForeColor = Color.Yellow
                    Ordem(i).BackColor = Color.Red
            End Select
[code]

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Agora que penso melhor, ao criares as textboxes podes não só adicionar à form mas também criar uma lista de referência.

Assim basta-te um For Each à lista de referência. List(Of TextBox) ou coisa que o valha.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Obrigado a todos pelas respostas.

Vou tentar outra abordagem com base no que disseram. Acho que já percebi o problema. Embora desconheça o palavreado técnico para o referir penso que o problema está em que:

        
For i As Integer = 1 To numero_de_dias_detrabalho
            Dim TextBoxHorario As New TextBox()
'...
            TesteFor.Controls.Add(TextBoxHorario)
            TextBoxHorario.Top = LabelDia.Top + 25
            TextBoxHorario.Left = 100
            TextBoxHorario.Name = "TextBoxHorario1"

Eu não adiciono as TextBox como devia visto que apenas estou a atribuir um nome diferente que nada mais é que uma String. O que deveria estar a fazer era criar um objecto ("TextBox") novo:

 
Dim ListaTextBox(20) As New TextBox
For i As Integer = 1 To numero_de_dias_detrabalho
ListaTextBox(i) = New TextBox      

Penso que desta forma irá funcionar. Daqui as uns dias quando voltar a ter tempo irei testar e conto-vos das novidades. Mais uma vez obrigado.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

E assim não dará?

Dim txt As TextBox = DirectCast(Me.Controls("nome_da_textbox"), TextBox)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Epa, excelente. Bem lembrado.

Ou isso ou o CType. Mas usa o directcast para ter a certeza, logo no IDE, que estás a fazer conversões de tipos como deve de ser.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

E assim não dará?

Dim txt As TextBox = DirectCast(Me.Controls("nome_da_textbox"), TextBox)

Como é que dá? Se só sabes o nome da TextBox em Runtime, O nome está associado ao Index que está associado ao nº de dias.

Se não tens nome, como é que referências no código? Como é que alteras uma propriedade ou um valor de um objecto que só vai ser criado em runtime? Eu não consegui, só consegui criando um array de objectos, e referenciando o objecto através do índice desse array.

Se fizeres txbCriadaEmRuntime.Text=.... o compilador não compila porque a TextBox não existe.

Ou estou a ver mal?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Desde que tenha um nome (propriedade NAME), podes ir directo à colecção de Controls através da KEY (o nome).

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Desde que tenha um nome (propriedade NAME), podes ir directo à colecção de Controls através da KEY (o nome).

Mas para isso, tens que criar todas as possibilidades, no exemplo que dei a cima, tenho 116 botões e 116 Imagens, tinha que as criar 1 a 1 para ter acesso a elas, ou neste caso, tens que criar TextBox para o nº máximo de dias de trabalho (independentemente se os vais aceder ou não em runtime), é isso? Parece-me mais trabalhoso, digo eu, ou não?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Tudo depende do que precisas de fazer.

Numa extensão dessas, o ciclo e o nome incrementado é bem mais fácil...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora