VB.NET | Validar Campo

diog0silva

Power Member
Boas. Já estou a entrar em parafuso como uma coisa aqui na minha aplicação.

Imaginemos que tenho um formulário para inserção e consulta de clientes. Tenho uma caixa de texto com o BI do cliente. Ao inserir um número de BI, ele verifica se já existe na base de dados algum cliente com aquele BI (através de uma função que criei, que retorna True se existir algum registo, e False se não existir nenhum). Este código está associado ao evento Validated da caixa de texto BI. Se o BI já existir na BD, aparece uma label à frente da caixa de texto a dizer "BI já existente".

Depois, ao clicar no botão Gravar, antes do código para gravar o registo, verifico novamente se o BI já existe na BD (isto porque é uma aplicação para ser usada por mais q uma pessoa). Então, chamo outra vez a função para verificar se o BI já existe. Se retornar True aparece uma msgbox e não grava. Caso contrário, grava o registo.

Corre tudo bem, o registo é adicionado. O problema é que, a seguir a adicionar o registo, a label do erro fica visivel, e aparece a mensagem "BI já existente". Já procurei no código todo, e a única linha de código onde essa label fica visivel é no evento Validated da textbox BI.

Ou seja, ele tá a validar o campo BI ao carregar no botão Gravar? É a unica explicação que encontro para a label ficar vísivel. O que é que estou a fazer mal?
 
Função para verificar se já existe BI:
Código:
[COLOR=white]Public VerificarSeExisteCliente() As Boolean[/COLOR]
 
[COLOR=white][SIZE=2][SIZE=2]Dim[/SIZE][/SIZE][SIZE=2] db [/SIZE][SIZE=2][SIZE=2]As [/SIZE][/SIZE][SIZE=2][SIZE=2]New[/SIZE][/SIZE][/COLOR][SIZE=2][COLOR=white] SqlConnection(ConString)[/COLOR][/SIZE]
[SIZE=2][COLOR=white]db.Open()[/COLOR][/SIZE]
 
[COLOR=white][SIZE=2][SIZE=2]Dim[/SIZE][/SIZE][SIZE=2] varsql [/SIZE][SIZE=2][SIZE=2]As [/SIZE][/SIZE][SIZE=2][SIZE=2]String[/SIZE][/SIZE][/COLOR]
[SIZE=2][COLOR=white]varsql = [/COLOR][/SIZE][SIZE=2][SIZE=2][COLOR=white]"SELECT * FROM tab_cliente WHERE clt_bi = @bi"[/COLOR][/SIZE][/SIZE]
 
[COLOR=white][SIZE=2][SIZE=2]Dim[/SIZE][/SIZE][SIZE=2] cmd [/SIZE][SIZE=2][SIZE=2]As [/SIZE][/SIZE][SIZE=2][SIZE=2]New[/SIZE][/SIZE][/COLOR][SIZE=2][COLOR=white] SqlCommand(varsql, db)[/COLOR][/SIZE]
[SIZE=2][COLOR=white]cmd.Parameters.Add([/COLOR][/SIZE][COLOR=white][SIZE=2][SIZE=2]"@bi"[/SIZE][/SIZE][SIZE=2], SqlDbType.VarChar).Value = txtBI.Text[/SIZE][/COLOR]
 
[COLOR=white][SIZE=2][SIZE=2]Dim[/SIZE][/SIZE][SIZE=2] reader [/SIZE][SIZE=2][SIZE=2]As[/SIZE][/SIZE][/COLOR][SIZE=2][COLOR=white] SqlDataReader[/COLOR][/SIZE]
[SIZE=2][COLOR=white]reader = cmd.ExecuteReader[/COLOR][/SIZE]
 
[COLOR=white][SIZE=2][SIZE=2]If[/SIZE][/SIZE][SIZE=2] reader.HasRows [/SIZE][SIZE=2][SIZE=2]Then[/SIZE][/SIZE][/COLOR]
[COLOR=white][SIZE=2][SIZE=2]Return [/SIZE][/SIZE][SIZE=2][SIZE=2]True[/SIZE][/SIZE][/COLOR]
[SIZE=2][SIZE=2][COLOR=white]Else[/COLOR][/SIZE]
[/SIZE][COLOR=white][SIZE=2][SIZE=2]Return [/SIZE][/SIZE][SIZE=2][SIZE=2]False[/SIZE][/SIZE][/COLOR]
[COLOR=white][SIZE=2][SIZE=2]End [/SIZE][/SIZE][SIZE=2][SIZE=2]If[/SIZE][/SIZE][/COLOR]
 
[SIZE=2]db.Close()[/SIZE]

Código associado ao evento Validated da textbox txtBI
Código:
[SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff][COLOR=white]If[/COLOR][/COLOR][/SIZE][/COLOR][/SIZE][COLOR=white][SIZE=2] VerificarSeExisteAtleta() = [/SIZE][SIZE=2][SIZE=2]True [/SIZE][/SIZE][SIZE=2][SIZE=2]Then[/SIZE][/SIZE][/COLOR]
[SIZE=2]txtBIerro.Text = [SIZE=2][SIZE=2][COLOR=white]"BI já existente"[/COLOR][/SIZE][/SIZE]
[COLOR=white]txtBIerro.Visible = [SIZE=2][SIZE=2][COLOR=white]True[/COLOR][/SIZE][/SIZE][/COLOR]
[COLOR=white]txtBI.Focus()[/COLOR][/SIZE]
[SIZE=2][SIZE=2][COLOR=white]Else[/COLOR][/SIZE][/SIZE]
[SIZE=2][COLOR=white]txtBIerro.Visible = [/COLOR][/SIZE][SIZE=2][SIZE=2][COLOR=white]False[/COLOR][/SIZE]
[/SIZE][COLOR=white][SIZE=2][SIZE=2]End [/SIZE][/SIZE][SIZE=2][SIZE=2]If[/SIZE][/SIZE][/COLOR]

Código associado ao botão Gravar
Código:
If VerificarSeExiste Cliente() = True Then
MsgBox("Já existe cliente!")
Else
Dim db As New SqlConnection(ConString)
db.Open()
 
Dim varsql As String = "INSERT INTO tab_cliente VALUES (@bi, @nome, .....)
Dim cmd As New SqlCommand (varsql, db)
[SIZE=2]cmd.Parameters.Add[COLOR=white]([/COLOR][/SIZE][SIZE=2][SIZE=2][COLOR=white]"@bi"[/COLOR][/SIZE][/SIZE][SIZE=2][COLOR=white],[/COLOR] SqlDbType.Int).Value = txtBI.Text[/SIZE]
[SIZE=2][SIZE=2]cmd.Parameters.[COLOR=white]Add([/COLOR][/SIZE][SIZE=2][SIZE=2][COLOR=white]"@nome"[/COLOR][/SIZE][/SIZE][SIZE=2][COLOR=white],[/COLOR] SqlDbType.VarChar).Value = txtNome.Text.Trim[/SIZE]
[SIZE=2]...[/SIZE]
 
[SIZE=2]cmd.ExecuteNonQuery()[/SIZE]
[SIZE=2]db.Close()[/SIZE]
 
[SIZE=2]lblErro.Visible = False[/SIZE]
[SIZE=2]ActualizarDados()[/SIZE]
[/SIZE]



Método ActualizarDados:
Código:
Dim db As New SqlConnection(ConString)
db.Open()
 
Dim varsql As String = "SELECT * FROM tab_cliente"
Dim cmd As New SqlCommand (varsql, db)
Dim SqlApd As New SqlDataAdapter(cmd)
Dim dt As New DataTable
SqlAdp.Fill(dt)
 
[COLOR=white]txtBI.Text = [SIZE=2]dt.Rows(0).Item([/SIZE][SIZE=2][SIZE=2]"clt_bi"[/SIZE][/SIZE][SIZE=2])[/SIZE][/COLOR]
[COLOR=white][SIZE=2]txtNome.Text = [SIZE=2]dt.Rows(0).Item([/SIZE][SIZE=2][SIZE=2]"clt_nome"[/SIZE][/SIZE][SIZE=2])[/SIZE][/SIZE][/COLOR]
[COLOR=white][SIZE=2]....[/SIZE][/COLOR]
 
[COLOR=white][SIZE=2]db.Close()[/SIZE][/COLOR]
 
Última edição:
txtBI.Text = String.Empty

Ao fazer isto, ele vai executar o código do evento Validated? É a única explicação que encontro.

EDIT: Já consegui resolver.
 
Última edição:
Código:
 public bool vtxts(string txt, System.Web.UI.WebControls.Label lbl)
                    {
                      bool res = false;

                      if (txt != "")
                      {
                        res = true;
                        lbl.Text = string.empty;
                      }
                      else
                        lbl.Text = "obrigatorio preencher";

                      return res;
                    }


tens aqui um exemplo em c# de validação de um campo se vazio ou n ....

é so para dar o exemplo ......

aqui recebe uma string (valor da caixa de texto e uma label (nome da label que diz o erro))

nota:

no teu caso em vez de receberes uma string recebes um datatable , e a label

Código:
 public bool vtxts(datatable dt , System.Web.UI.WebControls.Label lbl)

 {

aqui verificas os rows.count da mesma e devolves o bool 
e poes a mensagem de erro na respectiva label 
}

chamar da funcao       if(  txts(dt,nomadalabel))
                                grava dados

não precissas de validar as coisas duas vezes , chama so isso uma vez no botão gravar

inicializa na aplicão a label sem texto

agora é so converteres o code de c# para vb que é quase igual

este metodo que te dei esta a chamar uma label em asp.net

Código:
System.Web.UI.WebControls.Label lbl
tens de mudar o namespace para o teu caso caso seja windows forms

que penso que seja este
Código:
[/URL][/COLOR][B][COLOR=Red][URL="http://msdn.microsoft.com/en-us/library/system.windows.forms.aspx"]System.Windows.Forms[/URL].label[/COLOR][/B]


fazes em c#
Código:
  private bool valida( datatable dt , System.Windows.Forms.Label lbl)



espero que tenha ajudado
 
esteve a ver o que precisas, e basta pores assim


Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click

Label1.Text = Nothing
End Sub
 
Back
Topo