我有需要绑定到DataTable的复选框。问题是复选框存储"是"one_answers"否"值在Oracle数据库字段,而不是布尔值。如何绑定到这些值?
这行不通:
ChkInUse.DataBindings.Add("Checked", dtb, "IN_USE")
我得到错误:"String was not recognized as a valid Boolean".
EDIT(我的完整代码):
Dim SQL As String = "SELECT * from MyTable WHERE ID=" & Form1.DataGridView1.CurrentRow.Cells(0).Value.ToString
Dim dtb As New DataTable()
Using con As OracleConnection = New OracleConnection("Data Source=MyDB;User Id=Lucky;Password=MyPassword;")
Try
con.Open()
Using dad As New OracleDataAdapter(SQL, con)
dad.Fill(dtb)
End Using
ChkInUse.DataBindings.Add("Checked", dtb, "IN_USE")
由于您只是加载一行,我将手动设置和获取它:
dad.Fill(dtb)
' set the check
chkInUse.Checked = (dtb.Rows(0).Field(Of String)("IN_USE") = "YES")
(dtb.Rows(0).Field(Of String)("IN_USE") = "YES")
是一个表达式,产生一个布尔值,然后用来设置CheckState
。
然后在check changed事件中:
' early exit if there is no datatable yet or no rows
If dtb Is Nothing OrElse dtb.Rows.Count < 1 Then Return
dtb.Rows(0)("INUSE") = If(chkInUse.Checked, "YES", "NO")
这将做相反的事情:根据选中的状态将表文本设置为"YES"|"NO"。
表必须具有表单级别范围(在问题中不清楚),您需要检查表是否有效,以及表中是否有任何行(如图所示)。
如果您正在处理表中的多行,并且可能在DataGridView
中显示它,您可以在CellFormatting
和CellParsing
事件中做一些非常类似的事情,以从YES
来回转换为True/Checked。
另一个答案:
Dim IN_USE_Bind = New Binding("Checked", dtb, "IN_USE", True)
'Transform coming from dtb to ChkInUse
AddHandler IN_USE_Bind.Format, Sub(o, c) c.Value = (c.Value = "YES") 'Don t care about NO
'Transform coming from ChkInUse to dtb
AddHandler IN_USE_Bind.Parse, Sub(o, c) c.Value = If(c.Value, "YES", "NO")
'ChkInUse.DataBindings.Clear()
ChkInUse.DataBindings.Add(IN_USE_Bind)