我们有一个DataGridViewCheckBox列绑定到我们类中的布尔属性。
属性设置器有一些逻辑,表示在某些条件下,True标志不能更改,即它永远保持检查状态。这是基于每个记录。所以整个列不能只读,只能是某些行。
伪代码:
Public Property Foo() As Boolean
Get
Return _Foo
End Get
Set(ByVal value As Boolean)
If _Foo And Bar And value = False Then
//do nothing, in this scenario once you're true, you stay true
Else
_Foo = value
End If
End Set
End Property
数据绑定处理所有这些都很好,除了单击复选框时可以清除它。然后,当然,当绑定/ setter被触发时(当你离开那个单元格时),它会根据底层逻辑恢复到其检查状态。最终它并不重要,但它是一个笨拙的用户界面。
我们如何拦截用户的点击并对其进行检查?
答案 0 :(得分:1)
我认为他正在询问如何“有条件地”阻止它被取消选中...而不是如何以编程方式停止所有取消选中,因为您的示例已经显示
您要做的是使用CellFormatting和CellContentClick事件。
在CellFormatting中,您希望将包含所选项目的单元格设为只读,这将阻止您“取消选中”它。然后,您要检查CellContentClick中的当前单元格是否为true。如果是,那么您刚刚将此单元格更改为新的选中框,因此请循环显示每一行,将其他行关闭。
答案 1 :(得分:0)
这可以胜任,但有更优雅的解决方案吗?
Private Sub Grid1ButtonClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles Grid1.CellClick
//allow checking, but don't allow unchecking
If Grid1.Columns("myColumn").Index = e.ColumnIndex Then
Dim chkbox As DataGridViewCheckBoxCell = Grid1.CurrentCell
chkbox.ReadOnly = True
chkbox.Value = True
End If
End Sub