Benutzer mit den meisten Antworten
Probleme mit DataBinding

Frage
-
Hallo zusammen,
ich benutze Visual Studio 2008 + SQL Server 2008. Meine Windows-Anwendung basiert auf dem Framework 3.5 und ist mit VB .Net umgesetzt. Die Datenbindung ist auf Basis von ADO .Net über BindingSource-Objekte realisiert. Grob ist das DataBinding wie folgt implementiert:
Die zugeorndeten Spalten sind in der Datenbank als Date definiert .Probleme bereitet mir derzeit "lediglich" das Erfassen/Ändern von Datumswerten. Es gibt Konstellationen, in welchen nicht zwingend die Eingabe eines Datumswertes erforderlich ist, somit ein Leerstring als Text in der Textbox zulässig ist. Gibt der Benutzer ein Datum in einer Textbox ein, so muss es sich hierbei um ein gültiges Datum handeln. Ansonsten ist keine weitere Interaktion in der Anwendung möglich. Auch ist es nicht möglich, den ursprünglichen Eintrag in der Textbox zu löschen und ohne Eingabe weiter zu verfahren.Private mAkteBindingSource As New BindingSource mAkteBindingSource = New BindingSource(FallAkteDataSet, "Details") akteWegfallDatumTextBox.DataBindings.Add(New Binding("Text", mAkteBindingSource, "WegfallDatum", True))
Ich habe mir daraufhin die Einstellungen der betreffenden Textboxen näher angeschaut. Ereignisse sind keine hinterlegt, welche das Verhalten erklären könnten. Auch handelt es sich bei der Textbox selbst um eine "reine" Textbox und nicht um eine MaskedTextbox. Ich habe darüber hinaus schon versucht, die Option "FormattingEnabled" bei dem Setzen der Datenbindung von true auf false zu setzen. Danach ist es zwar möglich, auch ohne korrekte Eingabe die Textbox zu verlassen, allerdings wird bei dieser Variante der eingegebene und als falsch erkannte Text automatisch gelöscht. Auch wird bei Eingabe eines korrekten Datumswertes stets die Uhrzeit nach Verlassen der Textbox mit angezeigt (z.B. 15.08.2010 00:00:00), was in dieser Form nicht nötig ist. Eine Anzeige im Format dd.mm.yyyy scheint nicht möglich zu sein.
Kennt von euch jemand das Problem und kann mir weiterhelfen?
Vielen Dank,
Martin
Antworten
-
Hallo,
Probleme bereitet mir derzeit "lediglich" das Erfassen/Ändern von Datumswerten.
Es gibt Konstellationen, in welchen nicht zwingend die Eingabe eines
Datumswertes erforderlich ist, somit ein Leerstring als Text in der Textbox
zulässig ist. Gibt der Benutzer ein Datum in einer Textbox ein, so muss es
sich hierbei um ein gültiges Datum handeln. Ansonsten ist keine weitere
Interaktion in der Anwendung möglich. Auch ist es nicht möglich, den
ursprünglichen Eintrag in der Textbox zu löschen und ohne Eingabe
weiter zu verfahren.Im nachfolgenden Beispiel siehst Du, wie Du in die an ein
Feld vom Typ Date gebundene Textboxen einen Datumswert
oder einen Leerstring eintragen kannst.
Kopiere das Beispiel einfach in ein leeres Formmodul (Form1.vb).' / Beginn Code
Public Class Form1
Private mDT As DataTable
Private mBS As BindingSourcePrivate TB1 As TextBox
Private TB2 As TextBox
Private WithEvents btnPrevious As Button
Private WithEvents btnNext As ButtonPrivate Sub Form1_Load _
(ByVal sender As System.Object, _
ByVal e As System.EventArgs _
) Handles MyBase.LoadCreateData()
CreateControls()
BindControls()
End SubPrivate Sub BindControls()
mBS = New BindingSource
mBS.DataSource = mDTTB1.DataBindings.Add _
("Text", mBS, "ID", True, _
DataSourceUpdateMode.OnPropertyChanged, "")TB2.DataBindings.Add _
("Text", mBS, "Datum", True, _
DataSourceUpdateMode.OnPropertyChanged, "")
End SubPrivate Sub CreateData()
Dim Rnd As New Random(Now.Millisecond)
Dim i As Integer
Dim DR As DataRowmDT = New DataTable
With mDT
.Columns.Add("ID", GetType(Integer))
.Columns(0).Unique = True
.Columns(0).AutoIncrement = True
.Columns(0).AutoIncrementSeed = 1
.Columns(0).AutoIncrementStep = 1.Columns.Add("Datum", GetType(Date))
.Columns(1).AllowDBNull = TrueFor i = 1 To 10
DR = .NewRowDR.Item(1) = _
Date.Today.AddDays(Rnd.Next(1, 50)).Rows.Add(DR)
Next
.AcceptChanges()
End WithEnd Sub
Private Sub CreateControls()
TB1 = New TextBox
With TB1
.Name = "TB1"
.Font = New Font("Arial", 12)
.SetBounds(10, 15, Me.ClientSize.Width - 20, .Height)
.Anchor = AnchorStyles.Left Or AnchorStyles.Top Or AnchorStyles.Right
.ReadOnly = True
End With
Me.Controls.Add(TB1)TB2 = New TextBox
With TB2
.Name = "TB2"
.Font = TB1.Font
.SetBounds(10, TB1.Bottom + 15, TB1.Width, .Height)
.Anchor = TB1.Anchor
End With
Me.Controls.Add(TB2)btnPrevious = New Button
With btnPrevious
.SetBounds(10, TB2.Bottom + 25, 40, 40)
.Name = "btnPrevious"
.Text = "<"
End With
Me.Controls.Add(btnPrevious)btnNext = New Button
With btnNext
.SetBounds(btnPrevious.Right + 5, btnPrevious.Top, 40, 40)
.Name = "btnNext"
.Text = ">"
End With
Me.Controls.Add(btnNext)Me.ClientSize = New Size(300, btnNext.Bottom + 10)
End Sub
Private Sub btnPrevious_Click _
(ByVal sender As Object, _
ByVal e As System.EventArgs _
) Handles btnPrevious.ClickmBS.Position -= 1
End SubPrivate Sub btnNext_Click _
(ByVal sender As Object, _
ByVal e As System.EventArgs _
) Handles btnNext.ClickmBS.Position += 1
End Sub
End Class
' \\\ E N T ENach dem Programmstart siehst Du die Form1 mit 2 Textboxen
für die Felder "ID" und "Datum".
Mit den beiden Buttons kannst Du im Datenbestand vor und
zurück navigieren.
In die Textbox für das Datum kannst Du nun einen gültigen
Datumsausdruck oder einen Leerstring eintragen. Datumsfelder
in denen Du einen Leerstring einträgst erhalten den Wert DBNull.ValueGruß aus St.Georgen
Peter Götz
www.gssg.de (mit VB-Tipps u. Beispielprogrammen)- Als Antwort markiert Thorsten DörflerEditor Montag, 2. August 2010 06:04
Alle Antworten
-
Hallo.
Das Problem ist natürlich das DataSet welches für diese Eigenschaft nur Datumswerte zulässt. Wenn Du versucht die TextBox zu "verlassen" greift automatisch das "OnValidating" Event. Schau mal im Property Window der TextBox in "DataBindings - Advanced" rein. Dort kann man wählen zwischen:
DataSource Update Method: 1. OnValidation, 2. OnPropertyChanged, 3. Never
Eventuell musst Du dein "eigenes" OnChangeEvent schreiben um diese Prüfung zu machen.
Ist die DataColumn des DataSets überhaupt Nullable?
Das Format der TextBox musst Du natürlich auch selber bestimmen. DateTime hat immer oben angesprochenes Format.
Wieso benutzt Du nicht den DateTimePicker und arbeitest mit ShowCheckBox=True ?
-
Hallo,
Probleme bereitet mir derzeit "lediglich" das Erfassen/Ändern von Datumswerten.
Es gibt Konstellationen, in welchen nicht zwingend die Eingabe eines
Datumswertes erforderlich ist, somit ein Leerstring als Text in der Textbox
zulässig ist. Gibt der Benutzer ein Datum in einer Textbox ein, so muss es
sich hierbei um ein gültiges Datum handeln. Ansonsten ist keine weitere
Interaktion in der Anwendung möglich. Auch ist es nicht möglich, den
ursprünglichen Eintrag in der Textbox zu löschen und ohne Eingabe
weiter zu verfahren.Im nachfolgenden Beispiel siehst Du, wie Du in die an ein
Feld vom Typ Date gebundene Textboxen einen Datumswert
oder einen Leerstring eintragen kannst.
Kopiere das Beispiel einfach in ein leeres Formmodul (Form1.vb).' / Beginn Code
Public Class Form1
Private mDT As DataTable
Private mBS As BindingSourcePrivate TB1 As TextBox
Private TB2 As TextBox
Private WithEvents btnPrevious As Button
Private WithEvents btnNext As ButtonPrivate Sub Form1_Load _
(ByVal sender As System.Object, _
ByVal e As System.EventArgs _
) Handles MyBase.LoadCreateData()
CreateControls()
BindControls()
End SubPrivate Sub BindControls()
mBS = New BindingSource
mBS.DataSource = mDTTB1.DataBindings.Add _
("Text", mBS, "ID", True, _
DataSourceUpdateMode.OnPropertyChanged, "")TB2.DataBindings.Add _
("Text", mBS, "Datum", True, _
DataSourceUpdateMode.OnPropertyChanged, "")
End SubPrivate Sub CreateData()
Dim Rnd As New Random(Now.Millisecond)
Dim i As Integer
Dim DR As DataRowmDT = New DataTable
With mDT
.Columns.Add("ID", GetType(Integer))
.Columns(0).Unique = True
.Columns(0).AutoIncrement = True
.Columns(0).AutoIncrementSeed = 1
.Columns(0).AutoIncrementStep = 1.Columns.Add("Datum", GetType(Date))
.Columns(1).AllowDBNull = TrueFor i = 1 To 10
DR = .NewRowDR.Item(1) = _
Date.Today.AddDays(Rnd.Next(1, 50)).Rows.Add(DR)
Next
.AcceptChanges()
End WithEnd Sub
Private Sub CreateControls()
TB1 = New TextBox
With TB1
.Name = "TB1"
.Font = New Font("Arial", 12)
.SetBounds(10, 15, Me.ClientSize.Width - 20, .Height)
.Anchor = AnchorStyles.Left Or AnchorStyles.Top Or AnchorStyles.Right
.ReadOnly = True
End With
Me.Controls.Add(TB1)TB2 = New TextBox
With TB2
.Name = "TB2"
.Font = TB1.Font
.SetBounds(10, TB1.Bottom + 15, TB1.Width, .Height)
.Anchor = TB1.Anchor
End With
Me.Controls.Add(TB2)btnPrevious = New Button
With btnPrevious
.SetBounds(10, TB2.Bottom + 25, 40, 40)
.Name = "btnPrevious"
.Text = "<"
End With
Me.Controls.Add(btnPrevious)btnNext = New Button
With btnNext
.SetBounds(btnPrevious.Right + 5, btnPrevious.Top, 40, 40)
.Name = "btnNext"
.Text = ">"
End With
Me.Controls.Add(btnNext)Me.ClientSize = New Size(300, btnNext.Bottom + 10)
End Sub
Private Sub btnPrevious_Click _
(ByVal sender As Object, _
ByVal e As System.EventArgs _
) Handles btnPrevious.ClickmBS.Position -= 1
End SubPrivate Sub btnNext_Click _
(ByVal sender As Object, _
ByVal e As System.EventArgs _
) Handles btnNext.ClickmBS.Position += 1
End Sub
End Class
' \\\ E N T ENach dem Programmstart siehst Du die Form1 mit 2 Textboxen
für die Felder "ID" und "Datum".
Mit den beiden Buttons kannst Du im Datenbestand vor und
zurück navigieren.
In die Textbox für das Datum kannst Du nun einen gültigen
Datumsausdruck oder einen Leerstring eintragen. Datumsfelder
in denen Du einen Leerstring einträgst erhalten den Wert DBNull.ValueGruß aus St.Georgen
Peter Götz
www.gssg.de (mit VB-Tipps u. Beispielprogrammen)- Als Antwort markiert Thorsten DörflerEditor Montag, 2. August 2010 06:04