Forums Neueste Beiträge
 

CheckBox mittels BindingSource gebunden erzeugt Fehler

20/04/2008 - 16:11 von Hartmut Callies | Report spam
Hallo,
ich habe eine CheckBox mittels BindingSource an eine
Tabellenspalte (SQL Server 2005 Express) "aktiv" gebunden:

chkAktiv.DataBindings.Add("Checked", BS, "aktiv")

Es funktioniert nicht, wenn ich einen neuen Datensatz angelegt
habe. Es erhalte dann die Fehlermeldung: Ein Objekt kann nicht
von DBNull in andere Typen umgewandelt werden.
Das ist auch richtig, da im Datenfeld "aktiv" in der Datenbank
NULL steht.
Wenn ich in das Datenfeld in der Datenbank manuell àndere,
von NULL auf False oder True, funktioniert es bestens.

Nun hatte ich die Idee bei der Erstellung der Datenbank/Tabelle
dem Feld einen Standardwert vorzugeben:
CREATE TABLE Test (aktiv BIT DEFAULT 'False', .
Die Vorgabe wird aber ignoriert. Eine Fehlermeldung gibt es auch
nicht. In einem leeren Datensatz steht im Feld "aktiv" wieder NULL.

1. Gibt es eine Möglichkeit beim Binden der CheckBox an den
aktuellen Datensatz, den Wert NULL abzufangen und durch False
zu ersetzen?
2. Weiß jemand, warum der Vorgabewert beim Erstellen der Tabelle
nicht berücksichtigt wird?

Hartmut Callies
 

Lesen sie die antworten

#1 Peter Götz
20/04/2008 - 19:25 | Warnen spam
Hallo Hartmut,

ich habe eine CheckBox mittels BindingSource an eine
Tabellenspalte (SQL Server 2005 Express) "aktiv"
gebunden:

chkAktiv.DataBindings.Add("Checked", BS, "aktiv")



CheckBox.Checked kann nur die Werte True oder False
annehmen, aber nicht den Wert DBNull.Value.

Es funktioniert nicht, wenn ich einen neuen Datensatz
angelegt habe. Es erhalte dann die Fehlermeldung:
Ein Objekt kann nicht von DBNull in andere Typen
umgewandelt werden.



Und eben auch nicht in Boolean True oder False.

... schnipp...

Schau Dir mal das nachfolgende Beispiel an.

' /// Code in einer leeren Form1
Public Class Form1
Private mDT As DataTable
Private WithEvents mCM As CurrencyManager

Private WithEvents Text1 As TextBox
Private WithEvents Text2 As TextBox
Private WithEvents Check1 As CheckBox
Private WithEvents btnNext As Button
Private WithEvents btnPrevious As Button

Private WithEvents CBoxBinding As Binding

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

Me.Size = New Size(300, 200)
CreateControls()
CreateData()

Text1.DataBindings.Add _
(New Binding("Text", mDT, "ID"))

Text2.DataBindings.Add _
(New Binding("Text", mDT, "Monat"))

CBoxBinding = New Binding("CheckState", mDT, "Bool")
CBoxBinding.NullValue = False
Check1.DataBindings.Add(CBoxBinding)
End Sub

Private Sub CreateControls()
Text1 = New TextBox
With Text1
.Font = New Font("Arial", 12)
.SetBounds(10, 10, 50, .Height)
End With
Me.Controls.Add(Text1)

Text2 = New TextBox
With Text2
.Font = Text1.Font
.SetBounds(Text1.Right + 2, 10, 120, .Height)
End With
Me.Controls.Add(Text2)

Check1 = New CheckBox
With Check1
.Text = "Check1"
.Font = Text1.Font
.SetBounds(Text2.Right + 5, 10, 90, Text1.Height)
.AutoSize = True
.ThreeState = True
End With
Me.Controls.Add(Check1)

btnPrevious = New Button
With btnPrevious
.SetBounds(10, Text1.Bottom + 20, 40, 40)
.Text = "<"
End With
Me.Controls.Add(btnPrevious)

btnNext = New Button
With btnNext
.SetBounds _
(btnPrevious.Right + 5, _
btnPrevious.Top, _
40, 40)

.Text = ">"
End With
Me.Controls.Add(btnNext)
End Sub

Private Sub CreateData()
Dim i As Integer
Dim DR As DataRow

mDT = New DataTable
With mDT
.Columns.Add("ID", GetType(Integer))
.Columns.Add("Monat", GetType(String))
.Columns.Add("Bool", GetType(Boolean))

For i = 1 To 12
DR = .NewRow
DR.Item(0) = i
DR.Item(1) = MonthName(i)
Select Case True
Case i Mod 2 = 0
DR.Item(2) = True
Case i Mod 3 = 0
DR.Item(2) = DBNull.Value
Case Else
DR.Item(2) = False
End Select
.Rows.Add(DR)
Next
.AcceptChanges()
End With

mCM = _
DirectCast(Me.BindingContext(mDT), _
CurrencyManager)
End Sub

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

mCM.Position += 1
End Sub

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

mCM.Position -= 1
End Sub

Private Sub CBoxBinding_Format _
(ByVal sender As Object, _
ByVal e As System.Windows.Forms.ConvertEventArgs _
) Handles CBoxBinding.Format

Select Case True
Case e.Value Is DBNull.Value
e.Value = CheckState.Indeterminate
Case CBool(e.Value) = False
e.Value = CheckState.Unchecked
Case Else
e.Value = CheckState.Checked
End Select
End Sub

Private Sub CBoxBinding_Parse _
(ByVal sender As Object, _
ByVal e As System.Windows.Forms.ConvertEventArgs _
) Handles CBoxBinding.Parse

Dim CState As CheckState = CType(e.Value, CheckState)
Select Case CState
Case CheckState.Unchecked
e.Value = False
Case CheckState.Checked
e.Value = True
Case CheckState.Indeterminate
e.Value = DBNull.Value
End Select
End Sub
End Class
' \\\ E N T E

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

Ähnliche fragen