1

我正在使用与DataSet/绑定的 Xceed 网格DataTable。问题是,我需要知道在网格中加载新数据之前是否进行了更改,因此如果我不保存更改,则会丢失更改。

但是DataSetnorDataTable的函数都没有getChanges([DataRowState]) 返回正确的东西:S

我发现有时dataColumnChangeEvent会调用,但不是dataRowChangeEvent,这些是更改未保存到getChanges()函数中的时间。

当我在编辑单元格中单击网格而不是以任何方式选择另一个网格单元格时,就会发生这种情况。

另外,我已经看过了rowStateUnchanged即使数据发生了变化:S

有任何想法吗?

4

1 回答 1

0

伟大的!我终于找到了解决方案。

即使 dataRowChangeEvent 似乎没有被调用(我会在后面解释)

如果 rowChangeEvent 中的唯一代码是下面的代码,则它可以工作:

Private Sub RowChanged(ByVal sender As Object, ByVal e As DataColumnChangeEventArgs)
    If e.Row.RowState = DataRowState.Unchanged Then
        e.Row.AcceptChanges()
        e.Row.SetModified()
    End If
End Sub

我们检查 rowState 是因为我们只能 setModified() 一个未更改状态的行。

我们执行 AcceptChanges() 是因为只执行 setModified() 会删除已编辑单元格上的更改。

我们这样做 SetModified(0 因为如果不是 AcceptChanges() 则将 RowState 保留为 Unchanged,因此它不会进入表的 getChanges。

编辑:这带来了另一个问题,dataAdapter 使用数据行的原始值和当前值进行更新、删除和插入,执行“acceptChanges”将 OriginalValue 设置为当前值,因此删除和更新不再起作用:(

- 更多的 -

当我说它似乎没有进入事件时,这是因为下面的代码:

Private Sub RowChanged(ByVal sender As Object, ByVal e As DataColumnChangeEventArgs)
    If e.Row.RowState = DataRowState.Unchanged Then
        e.Row.AcceptChanges()
        e.Row.SetModified()
    End If
    MessageBox.Show("hasError=" & IIf(e.Row.HasErrors, "true ", "false ") & _
                    "; action=" & e.ProposedValue)
End Sub

既不显示消息框也不获取数据表的 getChanges() 中的更改...

此外,只有

MessageBox.Show("Changing")

而不是上一个消息框,显示消息框,并正确进行更改,但是它随后会破坏事件,因此它不会在 newProjectSelected => 没有加载新项目,但它只需要一个“重新-点击”。

所以,我已经解释了它的行为方式。

但这太奇怪了,如果有人能解释这种行为,我将不胜感激。

于 2012-08-20T15:09:04.283 回答