【问题标题】:How to set the CheckBox column in DataGridView value to true如何将 DataGridView 值中的 CheckBox 列设置为 true
【发布时间】:2016-04-18 10:22:24
【问题描述】:

GD 全部,

我正在寻找解决以下挑战的方法。

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

但不幸的是,我似乎无法让它工作......

以下代码循环遍历 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 列的帖子,但我无法让它们中的任何一个工作。

有人知道吗?

感谢您的建议?

【问题讨论】:

    标签: vb.net checkbox datagridview


    【解决方案1】:

    我不确定是否理解您的问题...但是有一种简单的方法可以检查和更改 datagridview 中的 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 中的每一行单击此按钮时,检查复选框单元格并根据其值将值设置为 FALSE 或 TRUE。

    希望对你有所帮助。

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

    【讨论】:

    • GD Ivan,据我所知,DataGridViewCheckBox 列不允许布尔值“True”或“False”设置。您可以拥有必须在列设置中设置的 TrueValue 或 FalseValue,但这是一个字符串变量,而不是布尔值。正如我的 OP 中所指出的,循环本身是正确的,但触发机制却不是。请参阅下面我自己的答案。
    【解决方案2】:

    GD 全部,

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

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

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

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

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

    看起来你调用表单的顺序会产生很大的不同,因为下面的代码可以完美地工作:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多