将复选框绑定到具有YES/NO值的Datatable



我有需要绑定到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中显示它,您可以在CellFormattingCellParsing事件中做一些非常类似的事情,以从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)

最新更新