Tipp-Upload: VB.NET 0184: Eingabe-Form
von Spatzenkanonier
Ü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.
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 |
Verwendete API-Aufrufe: |
Download: |
' 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.