如何将DataGridView值中的CheckBox列设置为true

时间:2016-04-17 13:23:02

标签: vb.net checkbox datagridview

GD All,

我正在四处寻找解决我的挑战的方法。

我有一个带有未绑定数据网格视图的表单,dg有一个添加的列,允许用户选择要使用的方法。 事件的状态存储在数据库中,在重新打开表单后,代码会检查事件是否处于“打开”状态。 state,如果是这样,它将先前选择的方法与datagrid中的方法进行比较,并应将先前激活的方法设置为“已选择”。方法

然而,我似乎无法让这件事发挥作用......

以下代码循环遍历dg中的方法并比较值,如果它符合methodID,则应将值设置为' True'无论如何,还是TrueValue。

如果数据库检查返回true并且在完全初始化表单之后初始化,其中session.methodID是返回的LINQ查询中的字段。

For Each r As DataGridViewRow In dgMethods.Rows

   If r.Cells(1).Value = session.methodID Then
      Dim c As DataGridViewCheckBoxCell = r.Cells(0)
      c.Value = c.TrueValue
   End If

Next

不幸的是,这并没有将复选框设置为“已选中”。 循环运行并评估r.Cells(1).Valuesession.methodID之间的比较是否正确并正确触发。

有趣的是,如果我在' CellContentClick'之后做了类似的循环。事件它确实做了预期的事情。 (以下示例将所有复选框值设置为选中)

Private Sub dgMethods_CellContentClick(sender As Object, e As DataGridViewCellEventArgs) Handles dgMethods.CellContentClick

    'Only single selection allowed, so clear table before submitting new selection
    For Each r As DataGridViewRow In dgMethods.Rows
        Dim c As DataGridViewCheckBoxCell = r.Cells(0)
        c.Value = c.TrueValue

    Next

    dgMethods.CommitEdit(DataGridViewDataErrorContexts.Commit)

End Sub

所以,显然只是在dgMethods上调用循环和dgMethods.CellContentClick事件触发时的状态存在差异,但我不知道哪一个? 尝试设置CheckBox列有很多帖子,但我无法让它们工作。

有人有任何想法吗?

我很感激您的建议?

2 个答案:

答案 0 :(得分:0)

我不确定你的问题是不正确的...但是有一种简单的方法来检查和更改数据网格视图中chechbox单元格的状态:

 Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        For Each dr As DataGridViewRow In DataGridView1.Rows
            If CBool(dr.Cells(0).Value) = True Then dr.Cells(0).Value = False : Continue For
            If CBool(dr.Cells(0).Value) = False Then dr.Cells(0).Value = True
        Next

    End Sub

在此示例中,当您为datagridview中的每一行单击此按钮时,检查checkboxcell并根据其值将值设置为FALSE或TRUE。

希望这会对你有所帮助。

还有一个提示。如果您使用他的名字访问单元格而不是他的索引使用他的名字,它应该可以帮助您避免麻烦;)

答案 1 :(得分:0)

GD All,

在进一步搜索后,我发现了以下有趣的行为。

方法选择过程是名为' frmAddEvent'的表单的一部分,frmAddEvent表单是使用以下例程从主窗体调用的。

创建新表单实例,然后使用名为InitializeForm()的表单类中的public sub填充,该表使用GUID参数检索相应的数据以设置表单字段。

If Not (isOpened(rsTankName.unqID)) Then
   Dim newForm As New frmAddEvent() '(rsTankName)
   newForm.InitializeForm(rsTankName)
   newForm.Show()

Else

End If

初始化子查询多个数据表,并在适当的情况下正确设置新表单实例中的相应字段。 该设置的一部分是method datagridview中的dgMethods选项。

看起来你调用表单的顺序会有所不同,因为下面的代码可以完美地运行:

If Not (isOpened(rsTankName.unqID)) Then
   Dim newForm As New frmAddEvent() '(rsTankName)

   newForm.Show()
   newForm.InitializeForm(rsTankName)
Else

End If

因此,在newForm.InitializeForm(rsTankName)事件之后调用newForm.Show 允许datagridview正确设置CheckBoxColumn。

可能因为实际的CheckBox本身实际上只是在Show命令上生成,尽管事实上它是可用的'作为在datagrid中具有DataGridViewCheckBoxColumn属性的单元格,直接在New frmAddEvent创建新表单实例之后。在调用newForm.Show事件之前,不会创建实际的CheckBox及其对应的CheckedState。看起来创建CheckBox以进行显示时(newForm.Show事件期间),没有与其实际值进行比较。

因此,为了在启动新表单时设置Checkbox列,您必须在设置DataGridViewCheckBoxColumn值之前调用Show事件,否则CheckBox将不会将其显示为' Checked'