none
Probleme mit DataBinding RRS feed

  • 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:

    Private mAkteBindingSource As New BindingSource
    mAkteBindingSource = New BindingSource(FallAkteDataSet, "Details")
    akteWegfallDatumTextBox.DataBindings.Add(New Binding("Text", mAkteBindingSource, "WegfallDatum", True))
    
    

    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.

    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

    Freitag, 30. Juli 2010 08:28

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 BindingSource

        Private TB1 As TextBox
        Private TB2 As TextBox
        Private WithEvents btnPrevious As Button
        Private WithEvents btnNext As Button

        Private Sub Form1_Load _
                (ByVal sender As System.Object, _
                 ByVal e As System.EventArgs _
                ) Handles MyBase.Load

            CreateData()
            CreateControls()
            BindControls()
        End Sub

        Private Sub BindControls()
            mBS = New BindingSource
            mBS.DataSource = mDT

            TB1.DataBindings.Add _
                    ("Text", mBS, "ID", True, _
                     DataSourceUpdateMode.OnPropertyChanged, "")

            TB2.DataBindings.Add _
                    ("Text", mBS, "Datum", True, _
                     DataSourceUpdateMode.OnPropertyChanged, "")
        End Sub

        Private Sub CreateData()
            Dim Rnd As New Random(Now.Millisecond)
            Dim i As Integer
            Dim DR As DataRow

            mDT = 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 = True

                For i = 1 To 10
                    DR = .NewRow

                    DR.Item(1) = _
                        Date.Today.AddDays(Rnd.Next(1, 50))

                    .Rows.Add(DR)
                Next
                .AcceptChanges()
            End With

        End 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.Click

            mBS.Position -= 1
        End Sub

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

            mBS.Position += 1
        End Sub
    End Class
    ' \\\ E N T E

    Nach 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.Value

    Gruß aus St.Georgen
    Peter Götz
    www.gssg.de (mit VB-Tipps u. Beispielprogrammen)

    Freitag, 30. Juli 2010 17:22

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 ?

    Freitag, 30. Juli 2010 11:59
  • 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 BindingSource

        Private TB1 As TextBox
        Private TB2 As TextBox
        Private WithEvents btnPrevious As Button
        Private WithEvents btnNext As Button

        Private Sub Form1_Load _
                (ByVal sender As System.Object, _
                 ByVal e As System.EventArgs _
                ) Handles MyBase.Load

            CreateData()
            CreateControls()
            BindControls()
        End Sub

        Private Sub BindControls()
            mBS = New BindingSource
            mBS.DataSource = mDT

            TB1.DataBindings.Add _
                    ("Text", mBS, "ID", True, _
                     DataSourceUpdateMode.OnPropertyChanged, "")

            TB2.DataBindings.Add _
                    ("Text", mBS, "Datum", True, _
                     DataSourceUpdateMode.OnPropertyChanged, "")
        End Sub

        Private Sub CreateData()
            Dim Rnd As New Random(Now.Millisecond)
            Dim i As Integer
            Dim DR As DataRow

            mDT = 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 = True

                For i = 1 To 10
                    DR = .NewRow

                    DR.Item(1) = _
                        Date.Today.AddDays(Rnd.Next(1, 50))

                    .Rows.Add(DR)
                Next
                .AcceptChanges()
            End With

        End 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.Click

            mBS.Position -= 1
        End Sub

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

            mBS.Position += 1
        End Sub
    End Class
    ' \\\ E N T E

    Nach 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.Value

    Gruß aus St.Georgen
    Peter Götz
    www.gssg.de (mit VB-Tipps u. Beispielprogrammen)

    Freitag, 30. Juli 2010 17:22
  • Hallo Peter,

    vielen Dank für Deine Antwort. Du hast mir sehr weitergeholfen. Problem gelöst und der Entwickler mehr als zufrieden :-)

    Viele Grüße,

    Martin

    Montag, 2. August 2010 05:26