【问题标题】:DataGridView CheckBox Display ThreeState But Have The User Work with Two StateDataGridView CheckBox 显示 ThreeState 但让用户使用两种状态
【发布时间】:2023-03-03 04:13:01
【问题描述】:

现状

我显示了一个包含自定义选项的传送带列表。选择多个传送带时,我将罕见选项显示为不确定的状态,如此:

这表明传送带 EB-1 和 EB-3没有具有相同的自定义选项(Test 和 Test2)。

目标

我希望用户能够单击不确定状态并将其设置为 false 或 true。当用户交互发生时,我不希望发生不确定状态。

使用三态映射加载选项

Public Enum TriState
    Common
    TurnedOn
    TurnedOff
End Enum

Private Sub LoadCustomOptions()
    ViewOptions.Table = DataSet1.CustomOptions

    With dgvOptions
        .DataSource = ViewOptions

        'Add checkbox
        Dim ChkBox As New DataGridViewCheckBoxColumn
        ChkBox.Name = "ColChk"
        ChkBox.HeaderText = ""
        ChkBox.MinimumWidth = 20
        ChkBox.AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells
        ChkBox.ThreeState = True
        ChkBox.TrueValue = TriState.TurnedOn
        ChkBox.FalseValue = TriState.TurnedOff
        ChkBox.IndeterminateValue = TriState.Common
        ChkBox.ValueType = GetType(TriState)
        ChkBox.DisplayIndex = 0

        'Width
        .Columns("Name").AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells
        .Columns("Description").AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill

        'Minimum Width
        .Columns("Description").MinimumWidth = 150

        .Columns.Add(ChkBox)
    End With
End Sub

尝试

这是我尝试过的:

Private Sub dgvOptions_CellContentClick(sender As Object, e As System.Windows.Forms.DataGridViewCellEventArgs) Handles dgvOptions.CellContentClick
    If e.RowIndex < 0 Then Exit Sub

    If dgvOptions.Columns(e.ColumnIndex).Name = "ColChk" Then
        If dgvOptions.Rows(e.RowIndex).Cells("ColChk").Value = TriState.TurnedOn Or dgvOptions.Rows(e.RowIndex).Cells("ColChk").Value = TriState.Common Then
            dgvOptions.Rows(e.RowIndex).Cells("ColChk").Value = TriState.TurnedOff
        Else
            dgvOptions.Rows(e.RowIndex).Cells("ColChk").Value = TriState.TurnedOn
        End If
    End If
End Sub

当用户单击自定义选项复选框时,我仍然会出现不确定状态。还有另一种我忽略的方法吗?

【问题讨论】:

  • msdn.microsoft.com/en-us/library/… 它展示了如何将枚举值“映射”到列
  • @Plutonix 抱歉,我对其进行了编辑以包含枚举映射。一开始我应该把它包括在内。

标签: vb.net winforms checkbox datagridview threestate


【解决方案1】:

终于明白了。请记住,我在 CurrentCellDirtyStateChanged 中使用了我的 TriState 枚举映射。

问题是 DataGridView.CurrentCell.Value 属性(它是复选框当前设置的唯一链接)通常仅在用户通过移动到另一个单元格使 DataGridView 提交对复选框的更改时才会更新。无论用户点击同一个复选框多少次,Value 属性都不会更新。

Private Sub dgvOptions_CurrentCellDirtyStateChanged(ByVal sender As Object, ByVal e As EventArgs) Handles dgvOptions.CurrentCellDirtyStateChanged
    If TypeOf dgvOptions.CurrentCell.OwningColumn Is DataGridViewCheckBoxColumn AndAlso dgvOptions.IsCurrentCellDirty Then

        dgvOptions.CommitEdit(DataGridViewDataErrorContexts.CurrentCellChange)

        If DirectCast(dgvOptions.CurrentCell.Value, TriState) = TriState.Common Then
            dgvOptions.CurrentCell.Value = TriState.TurnedOff
            dgvOptions.EndEdit()
        End If
    End If
End Sub

因此,解决方案是将 DataGridViewCheckBoxColumn 的 ThreeState 属性设置为 True 并强制 DataGridView 立即提交对复选框的更改,以便您可以测试 Indeterminate 设置并将 Value 属性更改为 Unchecked。

如需更多信息,this link对我帮助很大。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-27
    • 2011-12-17
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    • 2021-11-07
    相关资源
    最近更新 更多