Die Community zu .NET und Classic VB.
Menü

Tipp-Upload: VB.NET 0184: Eingabe-Form

 von 

Über den Tipp  

Dieser Tippvorschlag ist noch unbewertet.

Der Vorschlag ist in den folgenden Kategorien zu finden:

  • Fenster
  • Sonstiges

Dem Tippvorschlag wurden folgende Schlüsselwörter zugeordnet:
Eingabe, modal, showdialog

Der Vorschlag wurde erstellt am: 01.02.2008 10:23.
Die letzte Aktualisierung erfolgte am 02.06.2008 12:37.

Zurück zur Übersicht

Beschreibung  

Dieser TU soll eine Möglichkeit vorstellen, modale Eingabeformulare zu implementieren.
Dabei wird das Eingabeformular in einer Public Shared Function instanziert, mit Default-Werten "beschickt", und modal geöffnet.
Nach Schließen des Forms wird das DialogResult ausgewertet, und dementsprechend ein Rückgabewert aus den Steuerelementen ausgelesen und returnt.
Zur Verdeutlichung des Schemas sind 2 sehr unterschiedliche Eingaben implementiert.

Der Aufruf nach diesem Schema implementierter Eingabeforms entspricht prinzipiell dem Aufruf der InputBox()-Funktion, nur daß der Datentyp der Default- und Return-Werte den spezifischen Erfordernissen angepasst ist.

Für gelegentliche Eingaben (Anmeldung, Farbauswahl, etc.) ist dieses Muster gut geeignet - bei vielgenutzten Eingaben lassen sich häufig Lösungen finden, die es dem User ersparen, sich für jede Eingabe auf mehreren Forms orientieren, und mehrfach herumklicksen zu müssen.

Schwierigkeitsgrad

Schwierigkeitsgrad 1

Verwendete API-Aufrufe:

Download:

Download des Beispielprojektes [140,34 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 Projektgruppe InputForm.sln ------------
' ----------- Anfang Projektdatei InputForm.vbproj -----------
' --------------- Anfang Datei frmDataInput.vb ---------------
Imports InputForm.MitarbeiterDataSet

Public Class frmDataInput

    ' Designer-Einstellungen:
    ' frmDataInput.AcceptButton = btOk
    ' frmDataInput.CancelButton = btCancel
    ' btOk.DialogResult=DialogResult.Ok
    ' btCancel.DialogResult=DialogResult.Cancel

    Public Overloads Shared Function ShowDialog(ByVal [Default] As MitarbeiterRow) As MitarbeiterRow

        Using Frm As New frmDataInput                                ' instanzieren
            Frm.MitarbeiterDataSet.Mitarbeiter.ImportRow([Default])  ' Default-Wert einlesen

            If Frm.ShowDialog = Windows.Forms.DialogResult.OK Then   ' auf User-Ok testen
                Return GetRow(Of MitarbeiterRow)(Frm.MitarbeiterBindingSource.Current)

            Else

                Return Nothing
            End If

        End Using

    End Function

    ''' <remarks> Dieses Form kann nur in ShowDialog() instanziert werden</remarks>
    Private Sub New()

        InitializeComponent()

    End Sub

End Class

' ---------------- Ende Datei frmDataInput.vb ----------------
' ----------------- Anfang Datei frmMain.vb  -----------------
Imports InputForm.MitarbeiterDataSet

Public Class frmMain

    Private Sub Form_Load(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Load

        Reload()
        Me.lbTimeRange.Text = String.Format("{0:d} - {0:d}", Date.Today)

    End Sub

    Private Sub Reload()

        Me.MitarbeiterDataSet.Clear()
        Me.MitarbeiterDataSet.ReadXml("MitarbeiterDataSet.xml")
        StatusInfo("Daten geladen")

    End Sub

    Private Sub Save()

        ' EndEdit eigentlich unnötig, da dieses Form nicht editiert
        Me.MitarbeiterDataGridView.EndEdit()
        Me.MitarbeiterBindingSource.EndEdit()
        Me.MitarbeiterDataSet.WriteXml("MitarbeiterDataSet.xml")
        StatusInfo("Daten gespeichert")

    End Sub

    Private Sub Button_Click(ByVal sender As Object, ByVal e As EventArgs) Handles _
                btInputData.Click, btDeleteData.Click, _
                btReload.Click, btSave.Click, btInputTimeRange.Click

        Select Case True

            Case sender Is btInputTimeRange

                Dim sDates As String() = Me.lbTimeRange.Text.Split("-"c)
                Dim Dates As Date() = New Date() {Date.Parse(sDates(0)), Date.Parse(sDates(1))}
                Dim Input As Date() = frmTimeRangeInput.ShowDialog(Dates)

                If Input Is Nothing Then
                    StatusInfo("TimeRange bearbeiten abgebrochen")

                Else

                    Me.lbTimeRange.Text = String.Format("{0:d} - {1:d}", Input(0), Input(1))
                    StatusInfo("TimeRange übernommen")
                End If

            Case sender Is btInputData

                Dim [Default] As MitarbeiterRow = GetRow(Of MitarbeiterRow)( _
                    Me.MitarbeiterBindingSource.Current)

                Dim Input As MitarbeiterRow = frmDataInput.ShowDialog([Default])

                If Input Is Nothing Then
                    StatusInfo("Datensatz bearbeiten abgebrochen")

                Else

                    [Default].ItemArray = Input.ItemArray
                    StatusInfo("Datensatz übernommen")
                End If

            Case sender Is btDeleteData
                Me.MitarbeiterBindingSource.RemoveCurrent()

            Case sender Is btReload
                Reload()

            Case sender Is btSave
                Save()

        End Select

    End Sub

    ''' <summary>zur Bestätigung von User-Aktionen</summary>
    ''' <remarks>etwas aufwändiger als MsgBox(), aber blockiert nicht das Programm</remarks>
    Private Sub StatusInfo(ByVal Txt As String)

        Me.StatusLabel.Text = Txt
        timResetStatusBar.Enabled = True

    End Sub

    Private Sub timResetStatusBar_Tick(ByVal sender As Object, ByVal e As EventArgs) _
                Handles timResetStatusBar.Tick

        timResetStatusBar.Enabled = False
        Me.StatusLabel.Text = ""

    End Sub

End Class

' ------------------ Ende Datei frmMain.vb  ------------------
' ------------ Anfang Datei frmTimeRangeInput.vb  ------------
Public Class frmTimeRangeInput

    ' Designer-Einstellungen:
    ' frmTimeRangeInput.AcceptButton = btOk
    ' frmTimeRangeInput.CancelButton = btCancel
    ' btOk.DialogResult=DialogResult.Ok
    ' btCancel.DialogResult=DialogResult.Cancel

    Public Overloads Shared Function ShowDialog(ByVal [Default] As Date()) As Date()

        Using Frm As New frmTimeRangeInput                           ' instanzieren
            Frm.FromCalendar.SelectionStart = [Default](0)           ' Default-Wert einlesen
            Frm.ToCalendar.SelectionStart = [Default](1)

            If Frm.ShowDialog = Windows.Forms.DialogResult.OK Then   ' auf User-Ok testen
                Return New Date() {Frm.FromCalendar.SelectionStart, Frm.ToCalendar.SelectionStart}

            Else

                Return Nothing
            End If

        End Using

    End Function

    ''' <remarks> Dieses Form kann nur in ShowDialog() instanziert werden</remarks>
    Private Sub New()

        InitializeComponent()

    End Sub

End Class

' ------------- Ende Datei frmTimeRangeInput.vb  -------------
' ----------------- Anfang Datei Helpers.vb  -----------------
Imports System.Data

Public Module Helpers

    Public Function GetRow(Of T As DataRow)(ByVal Current As Object) As T

        If Current Is Nothing Then Return Nothing
        Return DirectCast(DirectCast(Current, DataRowView).Row, T)

    End Function

End Module

' ------------------ Ende Datei Helpers.vb  ------------------
' ------------ Ende Projektdatei InputForm.vbproj ------------
' ------------- Ende Projektgruppe InputForm.sln -------------

	

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.

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