【问题标题】:DataGridView : Update SQL Database when cell value changedDataGridView:当单元格值更改时更新 SQL 数据库
【发布时间】:2016-11-15 12:53:25
【问题描述】:

我创建了一个包含 DataGridView 的表单,并将第一列创建为复选框列,并且 fullrowselect 为 True。
我想当我单击行的复选框或更改所选行的复选框值时,应该在数据库中更新该特定记录...

我正确地编写了查询,但遇到了下面提到的一些问题。

现在我第一次尝试在单元格点击事件中...

 Private Sub DGVHelp_CellClick(sender As Object, e As DataGridViewCellEventArgs) Handles DGVHelp.CellClick
    Try
        If PubHelpCode = "ACTMAST" And e.ColumnIndex = 0 Then 'if only checkbox column is clicked
            cmd = New SqlCommand("Update FAMPAR SET Tag = '" & DGVHelp(0, e.RowIndex).Value & "' where Account_Code = '" & DGVHelp(1, e.RowIndex).Value & "' ", con1)
            ExecuteQuery(con1, "EDITCHECKBOX") ' Its my UDF
            DGV_Reset()' This clears the datagrid and fetch the data again
        End If
    Catch ex As Exception
        MsgBox(ex.ToString)
    End Try
End Sub

当我单击复选框单元格(第一列)时,事件首先运行,然后单元格的值被更改......即在 cellclick 事件期间,DGVHelp(0, e.RowIndex).Value 不会改变勾选或取消勾选时的值。

我什至尝试了 cellvaluechanged 事件,但它通过一些我不知道的连续过程将程序挂起......

我应该使用哪个事件来完成我的任务?

如果有与此任务相关的任何其他意见/想法,请分享...

下面分享的 Code OneDrive 链接..
Solution Code link

【问题讨论】:

  • 当您单击DataGridViewCheckBox 时,您对单元格所做的更改不会立即提交到数据源,直到您完成编辑单元格,然后更改将被推送到数据源。 CellClickCellContentClick 可以,但是你需要提交对数据源的更改,否则你读取的值不是你看到的值。看看这个帖子:DataGridView CheckBox column doesn't apply changes to the underlying bound object
  • 不要查找任何其他事件,只需使用CellClickCellContentClick this way
  • 是的,我试试@RezaAghaei

标签: vb.net winforms


【解决方案1】:

您必须使用DataGridView.CellValueChanged 事件。在您的情况下,这是最适合使用的事件。使用MouseClick 事件不是一个好主意。

https://msdn.microsoft.com/en-us/library/system.windows.forms.datagridview.cellvaluechanged(v=vs.110).aspx

在事件子中使用DataGridViewCellEventArgs 属性e.columnIndex 来检查编辑的列是否是包含复选框的列。否则你必须检查你的代码。

使用 sqlcommand 类时最好使用Using 子句

Using cmd as New SqlCommand("Update FAMPAR SET Tag = '" & DGVHelp(0, e.RowIndex).Value & "' where Account_Code = '" & DGVHelp(1, e.RowIndex).Value & "' ", con1)

        ExecuteQuery(con1, "EDITCHECKBOX") ' Its my UDF

End Using

编辑 1:

检查您的解决方案后。这不是很清楚,但您可以做一些解决方法。

1- 定义一个布尔变量m_BoolValueChanged

Private m_BoolValueChanged as Boolean = True

2- 在DGVHelp_CellValueChanged Sub 中使用这个变量来防止无限循环。喜欢关注:

Private Sub DGVHelp_CellValueChanged(sender As Object, e As DataGridViewCellEventArgs) Handles DGVHelp.CellValueChanged
    Try
        If PubHelpCode = "ACTMAST" And e.ColumnIndex = 0 Then

            If m_BoolValueChanged Then

            m_BoolValueChanged = False


            cmd = New SqlCommand("Update FAMPAR SET Tag = '" & DGVHelp(0, e.RowIndex).Value & "' where Account_Code = '" & DGVHelp(1, e.RowIndex).Value & "' ", con1)
            ExecuteQuery(con1, "EDITCHECKBOX")
            Dim ri As Integer = DGVHelp.CurrentRow.Index
            DGV_Reset()
            DGVHelp.Rows(ri).Selected = True

            m_BoolValueChanged = False


            End If


        End If
    Catch ex As Exception
        MsgBox(ex.ToString)
    End Try
End Sub

您可能会找到更好的解决方案,但这会有所帮助

【讨论】:

  • 我说我尝试改变单元格值...我会看到并告诉它卡在哪里挂起软件的循环。
  • 如果改变单元格值则进入无限循环
  • 同样获取数据可能会导致无限循环
  • 我得到了循环,但我不能在这里显示...我可以得到你的电子邮件吗,代码很大,可以在这里发布,它可能会跑题...或者给我发电子邮件
  • 您可以将您的解决方案附加到云并提供链接。所以大家可以帮忙
【解决方案2】:

在这个问题中,更好的解决方案是使用DataGridView.CellMouseClick 事件。当您仅单击任何单元格时,将触发此事件。

Private Sub DataGridView1_CellMouseClick(sender as Object, e as DataGridViewCellMouseEventArgs) _ 
    Handles DataGridView1.CellMouseClick

    'todo

End Sub

【讨论】:

  • 是的,我想到了 mouseclick 事件,但如果复选框用空格键更改,那么它将不起作用...@mww
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多