【问题标题】:How to multi-select and deselect rows in a DataGridView?如何在 DataGridView 中多选和取消选择行?
【发布时间】:2015-10-09 12:20:39
【问题描述】:

简而言之,我想要达到的确切效果是以下场景:

您有一个包含几行的 DataGridView,并且 DataGridView.MultiSelect 属性设置为 true。

如果您按住 CTRL 并单击行,您不仅可以选择行,甚至可以取消选择已选择的行 - 但如果不按住控制,您将无法执行此操作。

如何获得类似的效果?

当我(单独)单击多个 DataGridView 行时,DataGridView 选择的行为就像单击了 CTRL 按钮一样。

如果这是不可能的(我在另一个项目中看到过 :() 那么如何才能使 DataGridViewRows 一键被选中,如果尚未选中则取消选中?

【问题讨论】:

  • 所以你想强制用户逐行取消选择,对吧? - 移位选择呢?你要还是不要?
  • 我可以妥协。
  • 哈,这告诉我 - 没什么。我想指出的问题是:当您进行移位选择时,您可以轻松选择许多行,但无法轻松取消选择.. - 必须为您想要实施的全套计划!

标签: c# winforms datagridview multi-select deselect


【解决方案1】:

您可以在 KeyDown 和 KeyUp 事件(主窗体)上使用布尔变量来检查是否按下了 CTRL,然后处理来自 CellContentClick 或任何其他事件的行索引(传递行和列索引,可用于设置 Selected 属性)。只需执行一个 if 子句,它会检查是否设置了 CTRL 按下的 bool 变量,然后执行您的操作。

【讨论】:

  • +Gnqz 我希望自动按下 CTRL 按钮,而无需任何人按下它。这样就产生了多选效果。我不明白您的解决方案如何实现这一目标。
  • “自动按下”是什么意思?
  • 我的意思是通过代码。只要表单处于打开状态,就始终按下 CTRL。
  • 然后您可以在 CellContentClick 事件中检查单元格的 selected 属性。使用 gridview.Rows[e.RowIndex].Cells[e.ColumnIndex].Selected 查看它是否被选中并根据需要进行设置。如果我理解正确的话......
  • 除非我将每个选定的行存储在列表或其他东西中,否则这将如何实现多项选择?
【解决方案2】:

您可以尝试这个简单的解决方法,而无需通过如下处理预览鼠标按下事件来修改/继承 DataGrid 控件:

TheDataGrid.PreviewMouseLeftButtonDown += new MouseButtonEventHandler(TheDataGrid_PreviewMouseLeftButtonDown);


void TheDataGrid_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
    // get the DataGridRow at the clicked point
    var o = TryFindFromPoint<DataGridRow>(TheDataGrid, e.GetPosition(TheDataGrid));
    // only handle this when Ctrl or Shift not pressed 
    ModifierKeys mods = Keyboard.PrimaryDevice.Modifiers;
    if (o != null && ((int)(mods & ModifierKeys.Control) == 0 && (int)(mods & ModifierKeys.Shift) == 0))
    {
        o.IsSelected = !o.IsSelected;
        e.Handled = true;
    }
}

方法 TryFindFromPoint 是从该链接http://www.hardcodet.net/2008/02/find-wpf-parent 借用的函数,以便从您单击的点获取 DataGridRow 实例

通过检查 ModifierKeys,您仍然可以将 Ctrl 和 Shift 保留为默认行为。

这种方法的唯一缺点是您不能像原来那样单击并拖动来执行范围选择。但值得一试。

【讨论】:

  • 对不起。我可能应该提到这是一个 WinForms 项目。
  • @Barry 我建议您为此目的通过 msdn,因为我对 WinForms 知之甚少:msdn.microsoft.com/en-us/library/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-17
  • 1970-01-01
  • 2019-08-08
  • 2017-03-17
  • 1970-01-01
  • 2011-07-25
相关资源
最近更新 更多