MESMO LOSTFOCUS PARA V?RIOS CAMPOS

JCM0867 16/08/2017 17:59:09
#475814
Olá pessoal
Tenho uma tela coma vários maskedtext que são datas [Ô]__/__/____[Ô] (mskDate1, mskDate2, mskDate3...)

Criei a rotina :
Private Sub MyDates_LostFocus(sender As Object, e As EventArgs) Handles mskDate1.LostFocus, mskDate2.LostFocus, mskDate3.LostFocus
Se eu preencho a Date1 onde pego o valor desta data, o mesmo seria para Date2 e Date3? seria o sender? O sender até recebe a data mas não trata como date.
Para cada Data será uma situação diferente a ser tratada no LostFocus
End Sub

Até poderia fazer um LostFocus para cada data, mas não seria interessante numa futura manutenção..
A rotina acima funciona mas não estou sabendo pegar as respectivas datas [txt-color=#0000f0]preenchidas ou não preenchidas[/txt-color]

Grato
JABA 16/08/2017 18:31:45
#475819
Para cada evento disparado nos respectivos controles, o [Ô]sender[Ô] capturará o controle que o disparou. é só utiliza-lo como se fosse o próprio controle. Ex:

Msgbox(sender.Text)

ou

Msgbox(CDate(sender.Text))


KERPLUNK 16/08/2017 18:33:57
#475820
Sender é o objeto que disparou o evento. Você pode verificar isso na propriedade [Ô]sender.Name[Ô]. Também pode fazer o cast do sender diretamente no tipo dele e usar qualquer propriedade.

[ô]convertendo diretamente
DirectCast(sender, System.Windows.Forms.MaskedTextBox).Text

[ô]usando uma instância de objeto e cast
Dim chamante As System.Windows.Forms.MaskedTextBox = DirectCast(sender, System.Windows.Forms.MaskedTextBox).Text
chamante.Text = DateTime.Now;
JABA 16/08/2017 18:55:58
#475821
Resposta escolhida
Obs: Minha edição foi só para colocar o exemplo, nem tinha visto a postagem do Kerplunk. Fiquei com a janela aberta no mesmo lugar, sem carregar a página, e, alguns minutinhos depois, alterei o que havia postado.
JCM0867 17/08/2017 19:10:23
#475848
Ficou assim

Private Sub MaskedTextBox_LostFocus(sender As Object, e As EventArgs) Handles _
MaskedTextBox1.LostFocus,
MaskedTextBox2.LostFocus,
MaskedTextBox3.LostFocus

If Not IsDate(DirectCast(sender, System.Windows.Forms.MaskedTextBox).Text) And DirectCast(sender, System.Windows.Forms.MaskedTextBox).Text <> [Ô] / /[Ô] Then
MsgBox([Ô]Data Incorreta[Ô])
For Each controle As Control In Me.Controls
If TypeOf controle Is MaskedTextBox Then
If controle.Name = DirectCast(sender, System.Windows.Forms.MaskedTextBox).Name Then
controle.Text = [Ô][Ô]
controle.Focus()
End If
End If
Next
End If
End Sub
JABA 17/08/2017 19:23:19
#475849
Se sua intenção é limpar o controle que perdeu o foco, é só fazer direto.

Private Sub MaskedTextBox_LostFocus(sender As Object, e As EventArgs) Handles MaskedTextBox1.LostFocus, MaskedTextBox2.LostFocus, MaskedTextBox3.LostFocus

Dim msk as MaskedTextBox = DirectCast(sender, System.Windows.Forms.MaskedTextBox)

If (Not IsDate(msk.Text) AndAlso msk.Text <> [Ô] / /[Ô]) Then
MsgBox([Ô]Data Incorreta[Ô])
else
msk.Text = [Ô][Ô]
msk.Focus()
End if

End Sub

JCM0867 17/08/2017 22:38:43
#475851
Valeu Jaba,
só que o [Ô]else[Ô] está sobrando, tem que tira-lo para funcionar
Uma das coisas realmente e ver se a datá é válida, tem mais, não não fazem parte da dúvida.

Grato
Tópico encerrado , respostas não são mais permitidas