【问题标题】:Losing cell data when datagridview gets focus当 datagridview 获得焦点时丢失单元格数据
【发布时间】: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


【解决方案1】:

我决定从头开始重新创建表单,并且不再出现此错误。我已经比较了两组代码,找不到它们之间的差异。如果将来有人遇到此问题,请节省时间并重新创建与您的 dgv 相关的所有对象。

【讨论】:

    【解决方案2】:

    也许我知道如果 U 保存,焦点单元格中的语句不会保存在数据库表中

    这个问题我解决了 将空白文本框控件添加到包含 dgv 并命名为 txtFocus 的表单 将它放在 dgv 旁边并使用它的属性发送到后面或 由屏幕底部引起,所以不要显示它 然后 保存前 然后白色: txtFocus.Focus() sendKeys.send("{F2}")

    只有在这种情况下,U 才能将数据保存在 dgv 中更改的最后一个单元格中 最佳注册 阿什拉夫

    【讨论】:

      猜你喜欢
      • 2014-07-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-17
      • 1970-01-01
      • 1970-01-01
      • 2020-09-16
      • 1970-01-01
      相关资源
      最近更新 更多