Tuesday, March 5, 2019

Datetime Picker in VB.Net Textbox

Hi, Here I discuss about DateTime in VB.Net 
We all use DateTimePicker in VB Form for Date field. 
But I use DateTextBox in VB Form for Date field with watermark and Validation. 
Here not use DateTimePicker, simply create a class and use this. 
Try this code:

Imports System
Imports System.Drawing
Imports System.Windows.Forms

Public Class DateTextBox
    Inherits TextBox

    Public Sub New()
        MyBase.New()
        SetStyle(ControlStyles.AllPaintingInWmPaint Or ControlStyles.OptimizedDoubleBuffer, True)
        UpdateStyles()
        AddHandler TextChanged, AddressOf TextChange
        AddHandler FontChanged, AddressOf FontChange
        AddHandler KeyPress, AddressOf KeyPressed
        AddHandler Validated, AddressOf Validate
        CreateContainer()
    End Sub

    Dim WatermarkString0 As String = "DD/MM/YYYY"
    Dim WatermarkFont0 As Font = New Font(Me.Font, FontStyle.Regular)
    Dim WatermarkColor0 As Color = Color.Gray
    Dim WatermarkMaxLength As Integer
    Dim WatermarkContainer As Panel

    Private Sub CreateContainer()
        WatermarkContainer = New Panel
        WatermarkContainer.Width = Me.Width - 4
        WatermarkContainer.Height = Me.Height
        WatermarkContainer.Location = New Point(2, 0)
        WatermarkContainer.Anchor = AnchorStyles.Left + AnchorStyles.Right
        AddHandler WatermarkContainer.Paint, AddressOf WatermarkPaint
        AddHandler WatermarkContainer.Click, AddressOf WatermarkClick
        Me.Controls.Add(WatermarkContainer)
    End Sub

    Private Sub RemoveContainer()
        Me.Controls.Remove(WatermarkContainer)
    End Sub

    Private Sub WatermarkClick(sender As Object, e As EventArgs)
        Me.Focus()
    End Sub

    Private Sub WatermarkPaint(sender As Object, e As PaintEventArgs)
        Dim g As Graphics = e.Graphics
        g.DrawString(WatermarkString0, WatermarkFont0, New SolidBrush(WatermarkColor0), New PointF(-2.0!, 1.0!))
    End Sub

    Private Sub TextChange()
        If Text.Length = 0 Then
            CreateContainer()
        Else
            RemoveContainer()
        End If
    End Sub

    Private Sub FontChange()
        WatermarkFont0 = New Font(Me.Font, FontStyle.Regular)
    End Sub

    Private Sub KeyPressed(sender As Object, e As System.Windows.Forms.KeyPressEventArgs)
        If (e.KeyChar < Chr(47) Or e.KeyChar > Chr(57)) And (e.KeyChar <> Chr(8)) And (e.KeyChar <> Chr(127)) Then
            e.Handled = True
            MsgBox("Enter correct Date format DD/MM/YYYY", MsgBoxStyle.Critical, "ERROR!")
        End If
    End Sub

    Private Sub Validate(sender As Object, e As System.EventArgs)
        Dim d As Date
        If Text <> "" Then
            Try
                d = Text
                Text = d
            Catch ex As Exception
                MsgBox("Enter correct Date format DD/MM/YYYY", MsgBoxStyle.Critical, "ERROR!")
                Me.Select()
            End Try
        End If
    End Sub

    Protected Overrides Sub OnInvalidated(e As System.Windows.Forms.InvalidateEventArgs)
        MyBase.OnInvalidated(e)
        WatermarkContainer.Invalidate()
    End Sub

    Public Property WatermarkText As String
        Get
            Return WatermarkString0
        End Get
        Set(value As String)
            WatermarkString0 = value
            Me.Invalidate()
        End Set
    End Property

    Public Property WatermarkColor As Color
        Get
            Return WatermarkColor0
        End Get
        Set(value As Color)
            WatermarkColor0 = value
            Me.Invalidate()
        End Set
    End Property
End Class

If there is any other better option,
Please share it here or mail to me arkaa4@gmail.com

Thank You,
Arka Gupta.

No comments:

Post a Comment