Vb.net DataGridView.ClearSelection()未按预期工作

Vb.net DataGridView.ClearSelection()未按预期工作,vb.net,datagridview,Vb.net,Datagridview,在我的应用程序中,我使用代码dgvCases.ClearSelection()取消选择所有行。现在,视觉上什么都没有被选中,但实际上第一行被选中了。这是我从所选行的“id”列获取值的代码 Try caseId = dgvCases.Item("Id", dgvCases.CurrentRow.Index).Value MsgBox(caseId) Catch ex As Exception MsgBox("Please select a row", MsgBoxSt

在我的应用程序中,我使用代码
dgvCases.ClearSelection()
取消选择所有行。现在,视觉上什么都没有被选中,但实际上第一行被选中了。这是我从所选行的“id”列获取值的代码

Try
     caseId = dgvCases.Item("Id", dgvCases.CurrentRow.Index).Value
     MsgBox(caseId)
Catch ex As Exception
     MsgBox("Please select a row", MsgBoxStyle.Information)
End Try

它从第一行获取不需要的“id”。那么到底出了什么问题,我如何才能真正清除第一行的选择呢。

从MSDN文档中,重点是我的:

通过取消选择所有选定单元格来清除当前选择

“现在视觉上没有选择任何内容”,因为实际上没有选择任何内容。您正在使用
CurrentRow.Index
从所选行获取一个值。但并不等同于一行/单元格。这是一个很好的例子

从上述链接答案的评论部分:

CurrentCell
返回与“Selected”不同的“active”单元格。即使选择了多行,活动单元格也可能位于其他位置,并且只能有一个活动单元格–Luke Marlin

而且,即使您取消选择数据网格视图中的所有内容,其中一个单元格仍将处于活动状态,因此您不能依赖此值为null或类似值,因为没有选择行丹尼尔·格雷

你最好的选择是替换

caseId = dgvCases.Item("Id", dgvCases.CurrentRow.Index).Value


清除所选内容后,这将触发捕捉块。旁注:验证是否有任何选定行。

默认情况下,您的
caseid
为0?因此,您可以使用
if-else语句来代替
try-catch
,如果用户单击数据网格,
caseid
也可以有一个值,因此添加一个类似
cellclick
的事件,然后如果用户单击您的
datagrid
将该值分配给您的
caseid
,我认为这将解决您的问题
caseId = dgvCases.Item("Id", dgvCases.SelectedRows(0).Index).Value