APAGAR VARIOS TEXTBOX ESPECIFICOS OU DE GROUPBOX

ROGERIOAZEVEDO 24/03/2012 11:50:12
#398139
Bom dia.

Conclui minha aplicação. Depois de te-la concluido, percebi que ao trocar de estado os dados preenchidos ficam preenchidos, desta forma o usuário teria que apagar para preencher com os novos dados. Eu gostaria, que ao trocar de estado no combobox, as informações fossem apagadas, porém não todos os texbox do formulário, mas alguns específicos. Coloquei uma função de apagar no evendo do combobox. Para ficar fácil de compreender coloquei um print. No print o user acabou de preencher e clicou no botão calcular, agora ao mudar de estado, gostaria que o formulário fosse tipo resetado, ou seja como se ele tivesse sido aberto.
A função que eu fiz não estava apagando todos os TEXTBOX não entendi o motivo. Para ficar fácil deixei comentado a parte que não ta apagando.

Private Sub COMBOBOX1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles COMBOBOX1.SelectedIndexChanged

Sub ClearCtrl1()
realizado1.ResetText()
realizado2.ResetText()
realizado3.ResetText()
realizado4.ResetText()
realizado5.ResetText()
realizado6.ResetText()
total_vendas.ResetText()
desconto1.ResetText()
desconto2.ResetText()
base_calculo.ResetText()
aliquota1.ResetText()
aliquota2.ResetText()
gerente.ResetText()
vendedor.ResetText()
soma_realizados.ResetText()
[ô]soma_realizados2.ResetText()
[ô]dif_realizados.ResetText()
[ô]dif_realizados2.ResetText()
[ô]dif_objetivos.ResetText()
[ô]dif_objetivos2.ResetText()
[ô]deb_anterior.ResetText()
[ô]deb_atual.ResetText()
[ô]dif_debito1.ResetText()
[ô]dif_debito2.ResetText()
[ô]End Sub

Eu também estava testando:

Public Sub Clear1()
Dim ctl As Control
For Each ctl In GROUPBOX1.Controls
If TypeOf ctl Is TextBox Then
DirectCast(ctl, TextBox).Text = String.Empty
ElseIf ctl.Controls.Count > 0 Then
Clear1()
End If
Next
End Sub
REIDARK 24/03/2012 12:12:50
#398141
Em vez de colocar a propriedade ResetText você poderia tentar colocar assim:

realizado1.Text = [Ô][Ô]

E assim por diante.
ROGERIOAZEVEDO 24/03/2012 12:20:34
#398142
Eu já havia testado assim, o resultado foi o mesmo. Eu percebo que quando mudo a ordem das texbox, algums deixam de ser apagadas além das mencionadas. Pode ser que eu não esteja sabendo onde colocar a função, tentei colocá-la no inicio da aplicação, e testei colocá-la no final.
PROGRAMADORVB6 24/03/2012 19:41:58
#398169
Olá boa noite.
Veja se este exemplo serve.
=============
== Na Classe ==
=============
Public Class Procedimentos
Public Enum Limpa_Controle
Todos = 0
TextBox = 1
ComboBox = 2
MaskedTextBox = 3
DateTimePicker = 4
End Enum

Public Property Limpeza As New Limpa_Controle

Public Sub LimpaCampos(ByVal c As Control, ByRef Limpeza As Limpa_Controle)
[ô] Percorre a coleção de controles de c.
Select Case Limpeza
Case Limpa_Controle.Todos

For Each ctr As Control In c.Controls
[ô] Verifica se o controle tem controles filhos;
[ô] se tiver, percorre a coleção.
If (ctr.Controls.Count > 0) Then
Call LimpaCampos(ctr, Limpa_Controle.Todos)
End If
[ô] Se encontrar um TextBox, limpa.

If (TypeOf ctr Is TextBox) Then
Dim t As TextBox = DirectCast(ctr, TextBox)
t.Text = String.Empty
End If
[ô] Se encontrar um ComboBox, limpa.
If (TypeOf ctr Is ComboBox) Then
Dim t As ComboBox = DirectCast(ctr, ComboBox)
t.Text = String.Empty
End If
If (TypeOf ctr Is MaskedTextBox) Then
Dim t As MaskedTextBox = DirectCast(ctr, MaskedTextBox)
t.Clear()
End If
If (TypeOf ctr Is DateTimePicker) Then
Dim t As DateTimePicker = DirectCast(ctr, DateTimePicker)
t.Value = Today
End If
[ô] Coloque aqui mais controles
[ô]...
Next

[ô]=================[ Individual : Texbox ]===================
Case Limpa_Controle.TextBox
For Each ctr As Control In c.Controls
[ô] Verifica se o controle tem controles filhos;
[ô] se tiver, percorre a coleção.
If (ctr.Controls.Count > 0) Then
Call LimpaCampos(ctr, Limpa_Controle.TextBox)
End If
[ô] Se encontrar um TextBox, limpa.

If (TypeOf ctr Is TextBox) Then
Dim t As TextBox = DirectCast(ctr, TextBox)
t.Text = String.Empty
End If
Next
[ô]=================[ Individual : Combobox ]===================
Case Limpa_Controle.ComboBox
For Each ctr As Control In c.Controls
[ô] Verifica se o controle tem controles filhos;
[ô] se tiver, percorre a coleção.
If (ctr.Controls.Count > 0) Then
Call LimpaCampos(ctr, Limpa_Controle.ComboBox)
End If
[ô] Se encontrar um Combobox, limpa.

If (TypeOf ctr Is ComboBox) Then
Dim t As ComboBox = DirectCast(ctr, ComboBox)
t.Text = String.Empty
End If
Next
[ô]=================[ Individual : Maskedbox ]===================
Case Limpa_Controle.MaskedTextBox
For Each ctr As Control In c.Controls
[ô] Verifica se o controle tem controles filhos;
[ô] se tiver, percorre a coleção.
If (ctr.Controls.Count > 0) Then
Call LimpaCampos(ctr, Limpa_Controle.MaskedTextBox)
End If
[ô] Se encontrar um Maskedbox, limpa.

If (TypeOf ctr Is MaskedTextBox) Then
Dim t As MaskedTextBox = DirectCast(ctr, MaskedTextBox)
t.Clear()
End If
Next
[ô]=================[ Individual : DateTimePicker ]===================
Case Limpa_Controle.DateTimePicker
For Each ctr As Control In c.Controls
[ô] Verifica se o controle tem controles filhos;
[ô] se tiver, percorre a coleção.
If (ctr.Controls.Count > 0) Then
Call LimpaCampos(ctr, Limpa_Controle.DateTimePicker)
End If
[ô] Se encontrar um DateTimePicker, limpa.

If (TypeOf ctr Is DateTimePicker) Then
Dim t As DateTimePicker = DirectCast(ctr, DateTimePicker)
t.Value = Today
End If
Next
End Select
End Sub

End Class

=============
== No Módulo ===
=============
Module DefGlobais
Public ObjProcedimentos As New Procedimentos
End Module

=============
== No Form ===
=============

[ô]Apagar para Todos os controles :
ObjProcedimentos.LimpaCampos(Me, Procedimentos.Limpa_Controle.Todos)

[ô]Especificar [ô]Apagar[ô] para um só controle :
ObjProcedimentos.LimpaCampos(Me, Procedimentos.Limpa_Controle.TextBox)


Espero ter ajudado.
Atenciosamente
Programadorvb6
ROGERIOAZEVEDO 24/03/2012 21:01:25
#398177
Olá Programador,

Boa noite!

Meu amigo muito obrigado pela ajuda. Pelo que eu entendi o código acima limpa tudo certo? O que eu precisava era um de algo que limpasse alguns TEXTBOX específicos e não todos, pois alguns tem texto fixo. Posso separar os TEXTBOX que deverão ser apagados em GROUPBOX específicos.

A Aplicação é uma calculadora. Posso postar o projeto completo aqui se achar necessário. No post acima dá pra ter uma ideia. O usuário seleciona o trimestre, e logo após seleciona o estado. Após selecionar o estado, o código escreve os objetivos de vendas e de visitas para cada estado. A partir daí o usuário digita as vendas realizadas nos períodos, as visitas realizadas no período, e também a inadimplencia atual e anterior.

Ao pressionar o botão calcular, a aplicação faz o calculo da gratificação para gerentes e vendedores. O projeto está praticamente pronto e funcionando perfeitamente, o que eu gostaria era que ao trocar a informação no COMBOBOX, seja estado ou trimestre, as informações fossem apagadas, para que o usuário não precisasse apagar de forma manual.

Os códigos que postei acima, funcionaram parcialmente, eu não entendi o motivo, mas apenas alguns dos TEXTBOX são apagados não todos. São 24 TEXTBOX que deveriam ser limpos mas apenas 15 estão sendo apagados. Desde já agradeço.
OCELOT 24/03/2012 21:47:19
#398179
Você não tem nenhum código que altera o valor do textbox quando o texto de algum outro é alterado, por exemplo no evento TextChanged?
ROGERIOAZEVEDO 24/03/2012 21:54:28
#398180
Segue projeto completo para sua avaliação.

Seleciona o período por exemplo: 1º trimestre
Selecione o estado por exemplo: BA

Preencha os campos:

Vendas nos 3 períodos por exemplo: 80.000 nos 3 períodos
Visitas nos 3 períodos por exemplo: 30 nos 3 períodos

Inadimplencia anterior e atual preencha: 10.000 em ambos

E pressione em calcular.

A formula trará um valor para a gratificação de gerente e vendedor.

Depois disso, troque a Unidade (estado) para por exemplo CE.

Com essa troca eu gostaria que limpasse as informações, de modo que o formulário voltasse ao mesmo estado de quando foi aberto.

Abraços.
TECLA 25/03/2012 14:21:14
#398198
Resposta escolhida
Faça o seguinte:

1. Acesse a guia Properties dos controles TEXTBOX, e altere o valor da propriedade TAG para 1, somente dos controles que se deseja apagar;
2. Copie as linhas de código abaixo e cole no escopo do FORM em questão;

Public Sub Clear3()
Dim ctl As Control
For Each ctl In limpar1.Controls
If TypeOf ctl Is TextBox Then
If CType(ctl, TextBox).Tag = [Ô]1[Ô] Then
CType(ctl, TextBox).Text = String.Empty
End If
End If
Next
End Sub


3. Por fim, faça a chamada a este método em alguma parte específica do código e veja se resolve.
RICART 25/03/2012 14:31:30
#398200
Se vc quer apagar de um group box expecífico:

vc chama a sub abaixo asim: LimparCampos(seu_groupbox)

Public Sub LimparCampos(ctlgroupbox as object)
For Each ctl In ctlgroupbox.Panel.Controls
If TypeOf ctl Is TextBox Then
ctl.Text = [Ô][Ô]
End If
Next
End Sub
ROGERIOAZEVEDO 25/03/2012 21:56:59
#398218
Obrigado a Todos.

Tecla, o código da forma que você passou não funcionou, mas você a ideia que você passou sobre a Tag salvou a ficha. Abaixo o código que usei. Abraços.

ublic Sub Limpar(ByVal controlP As Control)
Dim ctl As Control
For Each ctl In controlP.Controls
If TypeOf ctl Is TextBox Then
If CType(ctl, TextBox).Tag = [Ô]1[Ô] Then
DirectCast(ctl, TextBox).Text = String.Empty
End If
ElseIf ctl.Controls.Count > 0 Then
Limpar(ctl)
End If
Next
End Sub
Tópico encerrado , respostas não são mais permitidas