将Datagridview CheckBox状态设置为Indeterminate

时间:2017-03-21 13:03:26

标签: vb.net checkbox datagridview

我有一个Datagridview,它被设置为readonly并且程序设置为checked / unchecked / indeterminate。 但是,选中和取消选中选项工作正常,但不确定状态根本不起作用。代码示例包含在cellcontentclick处理程序中。

 If Not temp_man_pos = Nothing And Not temp_man_neg = Nothing Then
            If temp_abweichung <= temp_man_pos And temp_abweichung >= (-(temp_man_neg)) And Not temp_man_pos = Nothing And Not temp_man_neg = Nothing Then
                                   Me.DataGridView1.Rows(x).Cells("KAL_Measuring_Data_Result_1").Value = CheckState.Checked
                ' Me.DataGridView1.Rows(x).Cells("KAL_Measuring_Data_Result_1").Value = 1
            Else

                Me.DataGridView1.Rows(x).Cells("KAL_Measuring_Data_Result_1").Value = CheckState.Unchecked
                '  Me.DataGridView1.Rows(x).Cells("KAL_Measuring_Data_Result_1").Value = 0
            End If
        Else
                           Me.DataGridView1.Rows(x).Cells("KAL_Measuring_Data_Result_1").Value = CheckState.Indeterminate
        End If

在Datagridview选项中,True Value手动设置为1,false设置为0,不确定为2,这应该与checkstate.indeterminate相同。

我也尝试使用tristate选项,但.usedefault值在复选框中显示为已选中。

                Me.DataGridView1.DefaultCellStyle.WrapMode = DataGridViewTriState.True
            Me.DataGridView1.Rows(x).Cells("KAL_Measuring_Data_Result_1").ValueType = GetType(TriState)
            Me.DataGridView1.Rows(x).Cells("KAL_Measuring_Data_Result_1").Value = TriState.UseDefault

真与假价值观虽然很好。

我做错了什么?

2 个答案:

答案 0 :(得分:1)

感谢您的回复。

最后我想出来解决这个问题,虽然我对它有点困惑......

<强>问题:

我将Threestate设置为true,将不确定值设置为2并尝试按如下代码设置Threestate:

DataGridView1.Rows(x).Cells("KAL_Measuring_Data_Result_1").Value = CheckState.Indeterminate

该解决方案未在Datagridview复选框中显示不确定状态,复选框显示为已选中。

<强>解决方案:

我将Datagridview值设置如下:

Me.DataGridView1.Rows(x).Cells("KAL_Measuring_Data_Result_1").Value = DBNull.Value

现在,不确定状态显示在Datagridview复选框中!

因此,对Tristate的valuetype没有用,Threestate Value手动设置为2,Checkstate.Indeterminate也是Checkbox值。

有人可以解释这种行为吗?

谢谢大家的帮助,希望我的回答是可以理解的!

答案 1 :(得分:0)

我仍然对什么不起作用感到困惑。我可能错了,但下面的代码可能有助于证明我所描述的内容。在复选框列的ThreeState属性设置为“False”的情况下:这将只有两(2)个可能的值:false(0)表示false,其他任何数字表示true。即使数字为-1,4,-3,所有这些值都会将检查状态设置为“已检查”,并且唯一的false值为零(0)。

对于复选框列的ThreeState属性设置为“True”的情况:那么这将具有三(3)个或更多可能的值:零(0)表示false,一(1)对于{和IndeterminateValue为真,为2(2)。如果值不是0,1或2,则此状态中的任何其他值都将引发错误。两个(2)似乎是Indeterminate的默认值。

使用此选项,如果将复选框列IndeterminateValue设置为除零(0)或一(1)以外的某个值,则将有4个可能的值。示例:如果设置,则中间值为-1,THEN Zero(0)将为false,1将为true,-1将为Indeterminate值,而Two(2)也将为不确定值。使用下面提供的测试代码,您将看到这种情况。注释掉下面的行,看看当这些值设置为复选框列时会发生什么。

cbCol.ThreeState = True
cbCol.IndeterminateValue = -1

下面的代码演示了当ThreeState设置为true并且IndeterminateValue设置为-1时,复选框单元格会在给出时显示一个实心的“Indeterminate”值负一(-1)和二(2)(默认值)。此外,由于ThreeState设置为true,因此除零(0),一(1),负一(-1)和二(2)以外的任何其他值都将为无效状态引发错误。这可以通过下面第10行中的值来看出,这将引发错误,因为它不是0,1,-1或2.我希望这是有道理的。

enter image description here

Public Class Form1

  Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    SetDGVColumns()
    FillGrid()
  End Sub

  Private Sub SetDGVColumns()
    DataGridView1.Columns.Add("Name", "Name")
    Dim cbCol As DataGridViewCheckBoxColumn = New DataGridViewCheckBoxColumn()
    cbCol.ThreeState = True
    cbCol.IndeterminateValue = -1
    DataGridView1.Columns.Add(cbCol)
  End Sub

  Private Sub FillGrid()
    DataGridView1.Rows.Add("Row1", CheckState.Checked)
    DataGridView1.Rows.Add("Row2", CheckState.Unchecked)
    DataGridView1.Rows.Add("Row3", CheckState.Indeterminate)
    DataGridView1.Rows.Add("Row4", True)
    DataGridView1.Rows.Add("Row5", False)
    DataGridView1.Rows.Add("Row6", 1)
    DataGridView1.Rows.Add("Row7", 0)
    DataGridView1.Rows.Add("Row8", -1)
    DataGridView1.Rows.Add("Row9", 2)
    DataGridView1.Rows.Add("Row10", -3)
  End Sub

  Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    MessageBox.Show("Row1 check state value: " + DataGridView1.Rows(0).Cells(1).Value.ToString() + Environment.NewLine +
                          "Row2 check state value: " + DataGridView1.Rows(1).Cells(1).Value.ToString() + Environment.NewLine +
                          "Row3 check state value: " + DataGridView1.Rows(2).Cells(1).Value.ToString())
  End Sub
End Class