Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #57 da revista programar. Faz já o download aqui!

Weasel

Herdar Controlos - TabControl

Mensagens Recomendadas

Weasel    3
Weasel

Boas,

É o seguinte, tenho uma TabControl com uma TAB, a TAB1, e queria por código poder criar outra tab a TAB2 mas com os mesmos controlos e layout que a TAB1, será uma "cópia" da TAB1 mas que irei inserir novos dados.

É possível não é? Mas como?

Obrigado!

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Weasel    3
Weasel

Não deve ser isso, porque realmente cria uma nova tabpage mas fica sem controlos nenhuns (e limpa a tabpage original, ficando esta também sem controlos nenhuns)

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
jpaulino    106
jpaulino

Mas se os controlos são os mesmos, porque não fazes crias uma subrotina para criar os controlos para o primeiro tab e depois essa subrotina para criar os controlos para o segundo.

É que depois tens de adicionar eventos tambem dinâmicamente e acho que desta forma dá mais trabalho.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
jpaulino    106
jpaulino

É que caso contrário tens de fazer um ciclo em todos os controlos e criar novos ... dá mais trabalho (digo eu) e repetes código desnecessário.

Tens de fazer algo como:

        Dim page As New TabPage
        page.Text = "New TabPage"
        page.UseVisualStyleBackColor = True
        For Each c As Control In Me.TabPage1.Controls

            If TypeOf c Is TextBox Then
                Dim tb As New TextBox
                tb.SetBounds(c.Location.X, c.Location.Y, c.Width, c.Height)
                page.Controls.Add(tb)
            ElseIf TypeOf c Is Button Then
                Dim btn As New Button
                btn.SetBounds(c.Location.X, c.Location.Y, c.Width, c.Height)
                btn.Text = c.Text
                page.Controls.Add(btn)
            End If
        Next

        ' etc para outros tipos de controlos que utilizas

        Me.TabControl1.TabPages.Add(page)

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Weasel    3
Weasel

Como disses-te consigo duplicar a minha TAB, funciona muito bem, agora estou com uma dúvida, como posso por um evento para essa nova tab, tipo se tiver um ListBox como posso usar o SelectedValueChanged ou Se tiver um TextBox usar o Keypress.

Se desse para por um evento que captasse de todos os tabs abertos e eu pudesse verificar em que TAB se deu o evento já servia...

Não sei é como por o Handles para apanhar os eventos de todas as tabs.

Usando um exemplo pratico, tenho um textbox em cada tab, e quero o evento Keypress

Se fosse só para uma tabpage seria assim:

Private Sub txtSendText_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles txtSendText.KeyPress
'Código aqui
End Sub

Agora não sei como fazer isto para tabs criadas por código, se desse como disse acima para por o evento para este textbox em todas as tabs bastava identificar em que tab se deu o evento que já servia  :bored:

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Weasel    3
Weasel

Não sei como aplicar esse código Hellblazer

Dim page As New TabPage
        page.Text = "New TabPage"
        page.UseVisualStyleBackColor = True
        For Each c As Control In Me.TabPage1.Controls

            If TypeOf c Is TextBox Then
                Dim tb As New TextBox
                tb.name = "txtTESTE"
                tb.SetBounds(c.Location.X, c.Location.Y, c.Width, c.Height)
                page.Controls.Add(tb)
           
            End If
        Next


        Me.TabControl1.TabPages.Add(page)

Como aplico aqui o

AddHandler NomeDaTextBox, AddressOf txtSendText_KeyPress

?

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Hellblazer    0
Hellblazer

Dim page As New TabPage
        page.Text = "New TabPage"
        page.UseVisualStyleBackColor = True
        For Each c As Control In Me.TabPage1.Controls

            If TypeOf c Is TextBox Then
                Dim tb As New TextBox
                tb.name = "txtTESTE"
                tb.SetBounds(c.Location.X, c.Location.Y, c.Width, c.Height)
                AddHandler tb.Click, AddressOf txtSendText_KeyPress
                page.Controls.Add(tb)
           
            End If
        Next


        Me.TabControl1.TabPages.Add(page)

Presumo...

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Weasel    3
Weasel

:-[  Ora bem, já duplico a Tab e já tenho o evento a funcionar, mas não faço ideia Qual o controlo a fazer "disparar" o evento, existe alguma propriedade onde eu possa saber qual foi o controlo que fez o evento disparar, ou em que Tab ele está (basta-me mesmo saber o nome da Tab em que o controlo está)

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
jpaulino    106
jpaulino

Usa o sender para ver que disparou o evento.

Private Sub txtSendText_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles txtSendText.KeyPress

End Sub

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Weasel    3
Weasel

Usa o sender para ver que disparou o evento.

Private Sub txtSendText_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles txtSendText.KeyPress

End Sub

Foi a 1ª coisa que experimentei mas retorna-me o nome da Form e não do controlo neste caso frmMain, por isso é que perguntei :-[

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
jpaulino    106
jpaulino

Deves ter feito alguma coisa mal  :)

Vê este exemplo para um botão:

    ' Cria um novo tab e copia os controlos
    Private Sub btnNew_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnNew.Click
        Dim page As New TabPage
        page.Text = "New TabPage"
        page.UseVisualStyleBackColor = True
        For Each c As Control In Me.TabPage1.Controls

            If TypeOf c Is TextBox Then
                Dim tb As New TextBox
                tb.SetBounds(c.Location.X, c.Location.Y, c.Width, c.Height)
                page.Controls.Add(tb)
            ElseIf TypeOf c Is Button Then
                Dim btn As New Button
                btn.SetBounds(c.Location.X, c.Location.Y, c.Width, c.Height)
                btn.Text = c.Text
                AddHandler btn.Click, AddressOf btnClick
                page.Controls.Add(btn)
            End If
        Next

        Me.TabControl1.TabPages.Add(page)
    End Sub


    ' Mostra qual o botão que foi pressionado
    Private Sub btnClick(ByVal sender As Object, ByVal e As System.EventArgs)
        Dim b As Button = DirectCast(sender, Button)
        MessageBox.Show(b.Text)
    End Sub

Repara que os delegates são diferentes de controlo para controlo e no .NET até podes nem os definir (designam-se relaxed delegates), mas neste caso tens de especificar os correctos, porque precisas de saber quem o disparou.

Neste caso, para um botão, são: "ByVal sender As Object, ByVal e As System.EventArgs"

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Nazgulled    8
Nazgulled

Não percebi se já resolveste o problema inicial ou não e se o fizeste, como o fizeste, mas fica aqui outra sugestão:

Podias fazer um user control com todos os controlos que precisas em cada tab, depois era só criares o controlo em runtime como fazes para qualquer outro tipo de controlo e adiciona-lo à respectiva tab.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Weasel    3
Weasel

:P Estou com outro problema, não percebo o que me está a falhar.

Se duplicar os controlos, tudo ok, mas se definir Anchor nos "novos" controlos eles ficam marados (isto se definir a anchor para right, porque Anchor em left não estraga.)

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
jpaulino    106
jpaulino

:P Estou com outro problema, não percebo o que me está a falhar.

Se duplicar os controlos, tudo ok, mas se definir Anchor nos "novos" controlos eles ficam marados (isto se definir a anchor para right, porque Anchor em left não estraga.)

Já te tinha alertado para isso!

Ou criar uma rotina que faça tudo dinamicamente, ou um user control, ou mesmo um form e depois inseres no painel.

Como estás a ver tens muitas opções melhores do que essa :)

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


×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade