2016-11-15 200 views
1

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

我写了查询,但面对下面提到的一些问题。

现在我第一次在小区click事件试过...

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 

当我点击复选框单元格(第一列),该单元格的值发生变化的情况下第一次运行,然后...即在单元格单击事件期间,如果DGVHelp(0,e.RowIndex).Value的值在打勾或未打勾时不会更改其值。

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

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

如果有关该任务的任何其他意见/想法是有,那么请共享......

守则OneDrive以下链接共享..
Solution Code link

+0

当你点击一个'DataGridViewCheckBox',你做对细胞的变化不会立即提交到数据源,直到您完成编辑单元格,然后更改将被推送到数据源。该'CellClick'或'CellContentClick'将是美好的,但你需要提交修改到数据源,否则你读出的值是不是你看到的价值。看看这篇文章:[DataGridView的复选框列不适改变底层绑定对象(http://stackoverflow.com/a/40348082/3110834) –

+0

不要找任何其它事件,只要使用' CellClick'或'CellContentClick' [这种方式](http://stackoverflow.com/a/34090635/3110834)。 –

+0

雅我尽量@RezaAghaei – bonny

回答

0

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

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

    'todo 

End Sub 
+1

是的,我想鼠标点击事件,但如果复选框有空格键改变,那么它将无法工作...... // @ MWW – bonny

0

您必须使用DataGridView.CellValueChanged事件。这是与您一起合作的最佳活动。使用MouseClick事件不是一个好主意。

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

里面的事件的子使用DataGridViewCellEventArgse.columnIndex属性来检查编辑的colunn是包含复选框的一个。否则,你必须检查你的代码。

最好是使用Using子句SqlCommand类工作时

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子,以防止无限循环。喜欢以下内容:

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 

您可能会找到更好的解决办法,但是这将有助于

+1

我说我试过的单元格值改变......我去看看,并告诉哪里它卡在挂起软件的循环中。 – bonny

+0

你能显示'DGV_Reset()'的代码吗? – Hadi

+0

如果它正在改变单元格值,那么它将进入无限循环 – Hadi

相关问题