0

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

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

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

我如何获得类似的效果?

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

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

4

2 回答 2

0

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

于 2015-07-20T11:39:20.953 回答
0

您可以尝试这个简单的解决方法,而无需通过处理预览鼠标按下事件来修改/继承 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 保留为默认行为。

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

于 2015-07-20T11:40:54.257 回答