You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CheckBox值更新后DataTable未同步,调用DataTable.GetChanges无结果

解决CheckBox值更新后DataTable.GetChanges返回Nothing的问题

核心问题分析

你的代码存在两个关键问题导致CheckBox的变化无法被DataTable检测到:

  1. 控件直接绑定到DataTable而非BindingSource,跳过了BindingSource的状态管理机制,数据变化未正确同步到DataRow的状态中。
  2. 未在获取变更前强制提交所有待处理的编辑操作,部分控件修改可能仍处于未提交状态。

具体修复步骤

1. 将所有控件绑定到BindingSource而非直接绑定DataTable

修改ManageSchedule_Load中的绑定代码,把数据源从_dtSchedule替换为_bsSchedule,同时统一设置DataSourceUpdateMode.OnPropertyChanged确保值变化立即同步:

If Not IsNothing(_dtSchedule) Then
    With _bsSchedule
        ScheduleIdTextBox.DataBindings.Add(New Binding("Text", .DataSource, "ScheduleId", False, DataSourceUpdateMode.OnPropertyChanged))
        AppointmentDateTimePicker.DataBindings.Add(New Binding("Value", .DataSource, "AppointmentDate", False, DataSourceUpdateMode.OnPropertyChanged))
        CleaningPersonComboBox.DataBindings.Add(New Binding("SelectedValue", .DataSource, "CleaningPersonsId", False, DataSourceUpdateMode.OnPropertyChanged))
        AssignedToComboBox.DataBindings.Add(New Binding("SelectedValue", .DataSource, "AssignedToId", False, DataSourceUpdateMode.OnPropertyChanged))
        ArrivedLateCheckBox.DataBindings.Add(New Binding("Checked", .DataSource, "ArrivedLate", False, DataSourceUpdateMode.OnPropertyChanged))
    End With
    ' 原有后续代码保持不变
End If

2. 在获取变更前强制提交编辑

在ManageSchedule_FormClosing事件开头添加EndEdit调用,确保所有未完成的修改都提交到DataTable:

Private Sub ManageSchedule_FormClosing(sender As Object, e As FormClosingEventArgs) Handles Me.FormClosing
    ' 强制提交所有待处理编辑
    _bsSchedule.EndEdit()
    
    Dim dChanges As DataTable = _dtSchedule.GetChanges() 

    ' 原有后续判断代码保持不变
End Sub

3. 验证DataTable列类型

确认_dtSchedule中ArrivedLate列的数据类型为Boolean。如果是整数(0/1)或其他类型,绑定Checked属性时会出现隐式转换问题,导致DataRow未标记为修改状态。可通过以下代码检查:

Debug.WriteLine(_dtSchedule.Columns("ArrivedLate").DataType.ToString())

若类型不符,需调整DataTable列定义或修改绑定的转换逻辑。

4. 调试DataRow状态(可选)

如果问题仍存在,可在FormClosing事件中添加调试代码查看行状态:

If _dtSchedule.Rows.Count > 0 Then
    Debug.WriteLine("当前行状态: " & _dtSchedule.Rows(0).RowState.ToString())
End If

正常修改后行状态应为Modified,此时GetChanges()会返回包含该行的DataTable。

内容的提问来源于stack exchange,提问作者IT2428

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 17:48:08