【发布时间】:2015-03-24 12:52:44
【问题描述】:
我知道我需要提供一些代码,但我不确定我应该展示什么,所以如果可以的话,请提出建议。
我在 Windows 窗体上有一个绑定的 datagridview。在表单加载并且 datagridview 获得焦点(鼠标单击)后,第一行(和特定列)丢失它的数据,将单元格的状态更改为脏。无论我在哪里单击以使 dgv 成为焦点,该行/列总是空白。触发了哪些可能触发数据丢失的事件?
同样,关于发布什么代码的任何建议都会很棒。我知道这将有助于回答这个问题。
编辑#1 这段代码是一个无限循环,但我添加它是为了回应评论:
Private Sub dgQCOrders_CellPainting(sender As Object, e As DataGridViewCellPaintingEventArgs) Handles dgQCOrders.CellPainting
If e.RowIndex = 0 And e.ColumnIndex = 9 Then
If e.FormattedValue <> e.Value Then
MsgBox("Changed")
Else
MsgBox("Unchanged")
End If
End If
End Sub
编辑#2:
Private Sub dgQCOrders_CellPainting(sender As Object, e As DataGridViewCellPaintingEventArgs) Handles dgQCOrders.CellPainting
If e.RowIndex = 0 And e.ColumnIndex = 9 Then
If e.FormattedValue <> e.Value Then
Me.txtTest.Text = "Changed"
Else
Me.txtTest.Text = "Unchanged"
End If
End If
End Sub
这个测试告诉我新的值是空的,它正在删除第一条记录(我已经知道了)——仍然不知道如何修复它!
编辑#3 更多解释:
目前,我正在处理的唯一事件是 form_Load,它使用我的(绑定)数据集的 tableadapter 填充 dgv。然后我将 dgv 绑定到绑定源。
我知道这个错误只发生在 dgv 获得焦点时(我通过在表单加载时将焦点设置到 dgv 来测试这个)。我在这个表单上有一系列复选框/列表框/文本框,允许用户动态过滤 dgv(后端,我过滤绑定源)。如果我首先过滤 dgv,当我将焦点移到 dgv 时,同一行和同一列(它们的索引不会改变)保持它的值。当我清除过滤器时,同一行和同一列再次丢失它的数据。
我确实在用户进行编辑后触发了 _CellStateChanged 事件。目前,它已被注释掉,因此数据丢失不会反映在我的数据集中。
此外,我在不同的表单上有另一个 dgv,以完全相同的方式绑定 _CellStateChanged 事件,一切都会正确触发和保存。我已经对这两种形式进行了设计器编码,我找不到两者之间的任何设置差异。
我在这里疯了!非常感谢任何帮助!
【问题讨论】:
-
可能 OnMouseClick 会是一个好的开始。
-
@thetimmer 你能详细说明一下吗?现在,每次单元状态更改时,我都会保存 dgv。但是为了获得对 dgv 的关注,第一次单击是我唯一一次丢失数据并且仅在该特定单元格中。不确定 mouseclick 事件如何改变这一点?
-
列数据类型是什么?
-
@Bioukh 我的数据源中的数据类型是浮点数,它作为文本框列存储在我的 dgv 中
-
您可以尝试在
CurrentCellDirtyStateChanged事件中添加断点,看看会发生什么。
标签: vb.net winforms datagridview