如何取消选择 DataGridView 控件中的所有选定行?

Posted

技术标签:

【中文标题】如何取消选择 DataGridView 控件中的所有选定行?【英文标题】:How to deselect all selected rows in a DataGridView control? 【发布时间】:2011-05-17 21:54:00 【问题描述】:

当用户单击控件的空白(非行)部分时,我想取消选择 DataGridView 控件中的所有选定行。 我该怎么做?

【问题讨论】:

【参考方案1】:

设置

dgv.CurrentCell = null;

当用户点击 dgv 的空白部分时。

【讨论】:

【参考方案2】:

要取消选择DataGridView 中的所有行和单元格,您可以使用ClearSelection method

myDataGridView.ClearSelection()

如果您甚至不希望第一行/单元格显示为选中状态,您可以CurrentCell property 设置为Nothing/null,这将暂时隐藏焦点矩形,直到控件再次获得焦点:

myDataGridView.CurrentCell = Nothing

要确定用户何时点击了DataGridView 的空白部分,您必须处理其MouseUp 事件。在这种情况下,您可以HitTest 点击位置并注意这是否表明HitTestInfo.Nowhere。例如:

Private Sub myDataGridView_MouseUp(ByVal sender as Object, ByVal e as System.Windows.Forms.MouseEventArgs)
    ''# See if the left mouse button was clicked
    If e.Button = MouseButtons.Left Then
        ''# Check the HitTest information for this click location
        If myDataGridView.HitTest(e.X, e.Y) = DataGridView.HitTestInfo.Nowhere Then
            myDataGridView.ClearSelection()
            myDataGridView.CurrentCell = Nothing
        End If
    End If
End Sub

当然,您也可以继承现有的DataGridView 控件,将所有这些功能组合到一个自定义控件中。您需要覆盖其OnMouseUp method,类似于上面显示的方式。为了方便起见,我还想提供一个公共的DeselectAll 方法,它既调用ClearSelection 方法,又将CurrentCell 属性设置为Nothing

(代码示例在 VB.NET 中都是任意的,因为问题没有指定语言——如果这不是您的母语,请见谅。)

【讨论】:

这似乎对我不起作用,我得到了它的工作,但我的 datagridview 没有=HitTestInfo.Nowhere 我不得不将其更改为.....If myDataGridView.HitTest(e.X, e.Y) Is myDataGridView.HitTest(e.X, e.Y) Then...按预期工作,但不能 100% 确定它为什么工作。实现了第一个 HitTest 代码。 @nora 你写的代码没有任何意义。它不应该起作用。 Is operator 比较两个引用变量的类型。因此,您所做的只是检查HitTest 属性是否返回与...HitTest 属性相同类型的值。这就像说If True = True @nora(续) 实际上,HitTest property 返回一个 HitTestInfo 类型的值。 HitTestInfo 是一个不可继承的类,其中包含一个名为 Nowhere 的静态字段。这是您需要比较的字段。我想让你绊倒的是HitTestInfo 类是DataGridView嵌套 类。我已经更新了我的答案以明确限定它。 @TaW 如果您指定“太快”的意思,那条评论会更有帮助。 好吧,我发现例如在构造函数 is 中填充 DGV 后“为时过早”。将 ClearSelection 移动到 Form_Shown 工作正常。不确定确切的规则是什么;也许像“布局后”之类的东西?我添加了注释,因为在类似的帖子中有很多 cmets 发现 ClearSelection 对他们不起作用。因此,将其添加到投票率高的答案中似乎是个好主意。【参考方案3】:

感谢 Cody 继承了 c# 的参考:

if (e.Button == System.Windows.Forms.MouseButtons.Left)
        
            DataGridView.HitTestInfo hit = dgv_track.HitTest(e.X, e.Y);
            if (hit.Type == DataGridViewHitTestType.None)
            
                dgv_track.ClearSelection();
                dgv_track.CurrentCell = null;
            
        

【讨论】:

【参考方案4】:

我遇到了同样的问题并找到了解决方案(不完全是我自己,但有互联网)

Color blue  = ColorTranslator.Fromhtml("#CCFFFF");
Color red = ColorTranslator.FromHtml("#FFCCFF");
Color letters = Color.Black;

foreach (DataGridViewRow r in datagridIncome.Rows)

    if (r.Cells[5].Value.ToString().Contains("1"))  
        r.DefaultCellStyle.BackColor = blue;
        r.DefaultCellStyle.SelectionBackColor = blue;
        r.DefaultCellStyle.SelectionForeColor = letters;
    
    else  
        r.DefaultCellStyle.BackColor = red;
        r.DefaultCellStyle.SelectionBackColor = red;
        r.DefaultCellStyle.SelectionForeColor = letters;
    

这是一个小技巧,您可以看到一行被选中的唯一方法是通过第一列(不是 column[0],而是因此)。当您单击另一行时,您将不会再看到蓝色选择,只有箭头指示选择了哪一行。如您所知,我在 gridview 中使用 rowSelection。

【讨论】:

【参考方案5】:

我发现了为什么我的第一行被默认选中,并发现了如何默认不选中它。

默认情况下,我的 datagridview 是我的 windows 窗体上第一个制表位的对象。首先在另一个对象上制作制表位(可能完全禁用数据网格的制表位)禁用选择第一行

【讨论】:

这实际上也解决了我的问题。出于某种奇怪的原因,将TabStop 属性更改为false 似乎会加载没有选定DataGridView 单元格/索引的表单。 这不起作用。如果在 SelectionChanged 事件上设置断点并启用 .NET Framework Source Stepping,则可以看到从 OnHandleCreated() 到 MakeFirstDisplayedCellCurrentCell() 的调用。这就是它发生的原因,而不是因为它可以被“标记”进去。【参考方案6】:

在 VB.net 中用于 Sub:

    Private Sub dgv_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles dgv.MouseUp
    ' deselezionare se click su vuoto
    If e.Button = MouseButtons.Left Then
        ' Check the HitTest information for this click location
        If Equals(dgv.HitTest(e.X, e.Y), DataGridView.HitTestInfo.Nowhere) Then
            dgv.ClearSelection()
            dgv.CurrentCell = Nothing
        End If
    End If
End Sub

【讨论】:

以上是关于如何取消选择 DataGridView 控件中的所有选定行?的主要内容,如果未能解决你的问题,请参考以下文章

c# datagridview 如何选中行,以及怎么获取选中行的数据

DataGridView控件中如何获取选中单元格内容?

C# 选中 DataGridView 控件中的行时显示不同的颜色

C#WinForm datagridview控件取消最左边存储行标题的列

DataGridView:如何使某些单元格无法选择?

C# 中datagridview中的如何给单元格设置滚动条,是单元格不是整个datagridview