Die Community zu .NET und Classic VB.
Menü

Tipp-Upload: VB.NET 0141: DatePickerControl

 von 

Über den Tipp  

Dieser Tippvorschlag ist noch unbewertet.

Der Vorschlag ist in den folgenden Kategorien zu finden:

  • Steuerelemente

Dem Tippvorschlag wurden folgende Schlüsselwörter zugeordnet:
DateTimePicker, DatePicker, Datum, Usercontrol

Der Vorschlag wurde erstellt am: 06.11.2007 16:31.
Die letzte Aktualisierung erfolgte am 08.04.2008 13:55.

Zurück zur Übersicht

Beschreibung  

NET (VB2005): das DateTimePicker Control kann kein Datum NULL verarbeiten, hier ein Ersatz, vom Design her absolut identisch, mit manueller Eingabe oder Auswahl über den Picker, Datum NULL, Eingabeprüfung etc. (Update am 07.03.2008)

Schwierigkeitsgrad

Schwierigkeitsgrad 2

Verwendete API-Aufrufe:

Download:

Download des Beispielprojektes [12,37 KB]

' Dieser Source stammt von http://www.activevb.de
' und kann frei verwendet werden. Für eventuelle Schäden
' wird nicht gehaftet.

' Um Fehler oder Fragen zu klären, nutzen Sie bitte unser Forum.
' Ansonsten viel Spaß und Erfolg mit diesem Source!
'
' Beachten Sie, das vom Designer generierter Code hier ausgeblendet wird.
' In den Zip-Dateien ist er jedoch zu finden.

' ------- Anfang Projektdatei DatePickerControl.vbproj -------
' ---------------- Anfang Datei DatePicker.vb ----------------
' -----------------------------------------------
'  DatePicker     VB2005
' -----------------------------------------------
'  der DateTimePicker erlaubt kein Datum NULL
'  hier der Ersatz mit der Möglichkeit der
'  manuellen Eingabe oder Auswahl über einen DTP
'
'  Autor       peter.k.sauer@web.de
'  created     06.11.2007
'  update
' -----------------------------------------------

Imports System.ComponentModel

Public Class DatePicker

    Inherits TextBox

    Private WithEvents m_Button As Button
    Private WithEvents m_DTP As DateTimePicker
    Private m_Editable As Boolean
    Private m_Validate As Boolean
    Private m_ValidateText As String
    Private m_OnEnterTab As Boolean

    ''' <summary>
    ''' ruft ab oder legt fest ob bei Enter
    ''' ein Tab ausgelöst wird
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    <Description("ruft ab oder legt fest ob bei Enterein Tab ausgelöst wird")> Public _
        Property OnEnterTab() As Boolean

        Get
            Return m_OnEnterTab

        End Get

        Set(ByVal value As Boolean)
            m_OnEnterTab = value

        End Set

    End Property

    ''' <summary>
    ''' Messagebox.Text bei Eingabefehler
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    <Description("Messagebox.Text bei Eingabefehler")> Public Property ValidateText() As String
        Get
            Return m_ValidateText

        End Get

        Set(ByVal value As String)
            m_ValidateText = value

        End Set

    End Property

    <Description("liefert das Datum oder stellt es ein")> Public Property Value() As DateTime
        Get

            Dim d As Date

            If Date.TryParse(Me.Text, d) Then
                Return d

            Else

                Return d
            End If

        End Get

        Set(ByVal value As DateTime)

            If value = Date.MinValue Then
                Me.Text = ""

            Else

                Me.Text = value.ToString("dd.MM.yyyy")
            End If

        End Set

    End Property

    ''' <summary>
    ''' DateTimePicker
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    <Description("DateTimePicker")> Public Property Picker() As DateTimePicker
        Get
            Return m_DTP

        End Get

        Set(ByVal value As DateTimePicker)
            m_DTP = value

        End Set

    End Property

    ''' <summary>
    ''' ruft ab oder legt fest ob eine Datumsprüfung _
    ''' durchgeführt werden soll
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>

    <Description("ruft ab oder legt fest ob eine Datumsprüfung durchgeführt werden soll")> _
        Public Property Validate() As Boolean

        Get
            Return m_Validate

        End Get

        Set(ByVal value As Boolean)
            m_Validate = value

        End Set

    End Property

    ''' <summary>
    ''' ruft ab oder legt fest ob ein Datum manuell 
    ''' eingegeben werden kann
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    <Description("ruft ab oder legt fest ob ein Datummanuell erfasst werden kann")> Public _
        Property Editable() As Boolean

        Get
            Return m_Editable

        End Get

        Set(ByVal value As Boolean)
            m_Editable = value

        End Set

    End Property

    Public Sub New()

        Me.OnEnterTab = True
        Me.Editable = True
        Me.Validate = True
        Me.ValidateText = "Datum ungültig"

        m_Button = New Button

        With m_Button
            .Parent = Me
            .Cursor = Cursors.Default
            .TabStop = False
            .BackColor = SystemColors.ButtonFace
            .ForeColor = SystemColors.WindowText
            .Size = New Size(17, 16)
            .Location = New Point(Me.ClientSize.Width - 17, 0)
            .Anchor = AnchorStyles.Top Or AnchorStyles.Right
            .Visible = True
        End With

        m_DTP = New DateTimePicker

        With m_DTP
            .Parent = Me
            .Format = DateTimePickerFormat.Short
            .Cursor = Cursors.Default
            .Size = Me.Size
            .Location = New Point(-2, -2)

            .Anchor = AnchorStyles.Top Or AnchorStyles.Left Or AnchorStyles.Right Or _
                AnchorStyles.Bottom

            .BringToFront()
            .Visible = False
        End With

    End Sub

    Protected Overrides Sub Finalize()

        m_Button.Dispose()
        m_DTP.Dispose()
        MyBase.Finalize()

    End Sub

    ''' <summary>
    ''' DTP Month anzeigen
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    ''' <remarks></remarks>
    Private Sub m_Button_Click(ByVal sender As Object, _
                    ByVal e As System.EventArgs) Handles m_Button.Click

        ShowMonth()

    End Sub

    ''' <summary>
    ''' Open Button zeichnen
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    ''' <remarks></remarks>
    Private Sub m_Button_Paint(ByVal sender As Object, _
                    ByVal e As System.Windows.Forms.PaintEventArgs) _
                    Handles m_Button.Paint

        Dim Gr As Graphics = e.Graphics

        Using Ft As New Font("Marlett", 9, FontStyle.Regular)
            Using Br As New SolidBrush(m_Button.ForeColor)
                Gr.DrawLine(Pens.White, 2, 1, 14, 1)
                Gr.DrawLine(Pens.White, 2, 1, 2, 13)
                Gr.DrawString("u", Ft, Br, 1, 1)
            End Using
        End Using

    End Sub

    ''' <summary>
    ''' DTP Visible = False
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    ''' <remarks></remarks>
    Private Sub m_DTP_CloseUp(ByVal sender As Object, _
                    ByVal e As System.EventArgs) Handles m_DTP.CloseUp

        m_DTP.Visible = False
        Me.Focus()

    End Sub

    ''' <summary>
    ''' Textbox aktualisieren
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    ''' <remarks></remarks>
    Private Sub m_DTP_TextChanged(ByVal sender As Object, _
                    ByVal e As System.EventArgs) Handles m_DTP.TextChanged

        Me.Text = m_DTP.Text

    End Sub

    ''' <summary>
    ''' OnEnterTab, bei F4 DTP Month anzeigen
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    ''' <remarks></remarks>
    Private Sub DatePicker_KeyDown(ByVal sender As Object, _
                    ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown

        If e.KeyData.ToString = "F4" Then
            e.Handled = True
            ShowMonth()

        ElseIf e.KeyData.ToString = "Return" Then

            If OnEnterTab Then
                e.Handled = True
                SendKeys.Send("{Tab}")
            End If
        End If

    End Sub

    ''' <summary>
    ''' DTP aktivieren und aufklappen
    ''' </summary>
    ''' <remarks></remarks>
    Private Sub ShowMonth()

        Try

            m_DTP.Text = Me.Text

        Catch ex As Exception

            MessageBox.Show(ex.Message)
            Me.Show()

        End Try

        Me.Focus()
        m_DTP.BringToFront()
        m_DTP.Visible = True
        m_DTP.Focus()
        SendKeys.Send("{F4}")

    End Sub

    ''' <summary>
    ''' Eingabeprüfung Datum
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    ''' <remarks></remarks>
    Private Sub DatePicker_KeyPress(ByVal sender As Object, _
                    ByVal e As System.Windows.Forms.KeyPressEventArgs) _
                    Handles Me.KeyPress

        If Not Editable Then
            If Convert.ToInt32(e.KeyChar) <> 8 Then
                e.Handled = True

            Else

                Me.Text = ""
            End If

            Exit Sub

        End If

        Select Case e.KeyChar

            Case "0"c To "9"c
            Case Convert.ToChar(8)
            Case ","c
                e.KeyChar = "."c

            Case "."c
            Case Else
                e.Handled = True

        End Select

    End Sub

    ''' <summary>
    ''' Logikprüfung Datum
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    ''' <remarks></remarks>
    Private Sub DatePicker_Validating(ByVal sender As Object, _
                    ByVal e As System.ComponentModel.CancelEventArgs) _
                    Handles Me.Validating

        If (Me.Text.Length = 0) Or (Not Validate) Then

            Exit Sub

        End If

        Dim s As String = Me.Text

        If s.Length <= 2 Then

            Dim i As Integer

            If Integer.TryParse(s, i) Then
                If (i > 0) And (i < 32) Then
                    s &= "." & Date.Now.Month.ToString
                End If
            End If
        End If

        Dim d As Date

        If Date.TryParse(s, d) Then
            Me.Text = d.ToString("dd.MM.yyyy")

        Else

            e.Cancel = True

            If Not String.IsNullOrEmpty(Me.Text) Then
                Me.SelectionStart = 0
                Me.SelectionLength = Me.Text.Length
            End If

            MessageBox.Show(ValidateText, "Fehler", MessageBoxButtons.OK, MessageBoxIcon.Error)
        End If

    End Sub

End Class

' ----------------- Ende Datei DatePicker.vb -----------------
' ------------------ Anfang Datei Form1.vb  ------------------
' -----------------------------------------------------
' Form1 zu DatePicker
' Datepicker1, Textbox1, DatePicker1, Textbox2, Button1
' -----------------------------------------------------

Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
        Handles Button1.Click

        MessageBox.Show(DatePicker1.Value.ToString)

    End Sub

End Class

' ------------------- Ende Datei Form1.vb  -------------------
' -------- Ende Projektdatei DatePickerControl.vbproj --------

	

Diskussion  

Diese Funktion ermöglicht es, Fragen, die die Veröffentlichung des Tipps betreffen, zu klären, oder Anregungen und Verbesserungsvorschläge einzubringen. Nach der Veröffentlichung des Tipps werden diese Beiträge nicht weiter verlinkt. Allgemeine Fragen zum Inhalt sollten daher hier nicht geklärt werden.
Folgende Diskussionen existieren bereits

Um eine Diskussion eröffnen zu können, müssen sie angemeldet sein.