【问题标题】:Unselect all rows on a DataGridView取消选择 DataGridView 上的所有行
【发布时间】:2023-04-01 02:48:01
【问题描述】:

有人知道如何取消选择 Windows 窗体 DataGridView 控件上的所有行吗?默认情况下,始终选择第一行...
另外,我不想允许任何类型的选择,你们知道有什么方法吗?

我已经在这里搜索过但找不到...

任何帮助都会很棒!

编辑: 好的,我找到了另一种取消选择行的方法:在DataGridViewRow.RowPostPaint() 事件上,使用Selected 属性取消选择发送事件的行。

private void grid_RowPostPaint(object sender, DataGridViewRowPostPaintEventArgs e)
{
    this.gridLogEntries.Rows[e.RowIndex].Selected = false;
}

【问题讨论】:

    标签: c# .net winforms datagridview


    【解决方案1】:

    我认为没有像 DisableSelection = true 这样简单的解决方案。

    不管怎样,用下面的方式处理SelectionChanged事件应该就够了:

    private bool skipEvents;
    
    void dataGridView1_SelectionChanged(object sender, EventArgs e)
    {
        if (skipEvents)
            return;
    
        skipEvents = true;
    
        // disable cell selection
        foreach (DataGridViewCell cell in this.dataGridView1.SelectedCells)
            cell.Selected = false;
        // disable row selection
        foreach (DataGridViewRow row in this.dataGridView1.SelectedRows)
            row.Selected = false;
        // disable column selection
        foreach (DataGridViewColumn col in this.dataGridView1.SelectedColumns)
            col.Selected = false;
    
        skipEvents = false;
    }
    

    编辑:

    为了避免递归调用方法,我稍微修改了代码。

    【讨论】:

    • 嗨 digEmAll!我没有尝试过你的建议,但我相信它有效。检查我放在 Rewinder 答案上的代码。无论如何感谢您的帮助! :)
    • @jmpcm:此解决方案不仅取消选择在创建网格时自动选择的第一行,而且还禁用所有类型的用户/程序选择。去尝试一下 ! ;)
    • 确实你的解决方案很酷!请检查我在帖子上所做的编辑,它也可以满足我的需要。我唯一不知道的是,我的解决方案是否比您的解决方案“重”,因为它会为插入的每一行执行一个事件……您怎么看?
    • Well, your code works because when a row is selected/clicked (not only when it's inserted) is "RePainted" to apply highlighing color.代码比我的略重,因为例如,如果您最小化然后最大化包含网格的表单,即使没有必要,也会为每一行调用该方法。此外,我认为在有关选择的事件处理程序中禁用选择会更好/更清晰/更正确。
    【解决方案2】:
    datagridview1.clearselection()
    

    这将在一个语句中解决问题,无需循环

    【讨论】:

      【解决方案3】:

      尝试禁用 tabstop 选项,这在一个类似的问题上对我有用

      【讨论】:

      • 单独禁用制表符对我没有用。在 Form_load 阶段设置 datagridview1.ClearSelection() 对我有用
      【解决方案4】:

      你试过了吗?

      myTable.CurrentRowIndex = -1;
      

      【讨论】:

      • 嗨!我找不到那个属性!但这对我来说是完美的解决方案(懒惰;))
      【解决方案5】:

      您可以尝试为每个选定的行调用 unselect 方法:

              for (int i = 0; i < bindingSource1.Count; i++)
              {
                  if (myGrid.IsSelected(i))
                  {
                      myGrid.UnSelect(i);
                  }
              }
      

      【讨论】:

      • 你好复卷机!您建议的属性不会退出,但此解决方案工作正常:“foreach (DataGridViewRow row in this.grid.Rows) { row.Selected = false; }”感谢您的帮助!
      • @jmpcm:也许代码是用于网络网格的。无论如何,您不需要遍历所有grid.Rows,而只需遍历grid.SelectedRows,如我的回答所示
      • 是的,我没想到(有时我很傻 xD)谢谢你的想法,但现在我正在使用我在帖子上完成的“编辑”中的代码. PS:很可能您的建议仅适用于网络网格,但我没有这些经验......
      • @jmpcm:实际上,我发布的代码是针对 DataGrid(您在原始帖子中提到的),而您的代码似乎针对 DataGridView,它基本上是经典 DataGrid 的更新版本.请参阅msdn.microsoft.com/en-us/library/ms171628.aspx 了解区别。
      • 你说得对,这完全是我的错!确实是一个 DataGridView 但通常我用较短的名称来称呼它。无论如何感谢您的帮助! :)
      猜你喜欢
      • 1970-01-01
      • 2011-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-28
      • 1970-01-01
      • 2011-07-25
      • 1970-01-01
      相关资源
      最近更新 更多