首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在DataGridView中多选和取消选择行?

如何在DataGridView中多选和取消选择行?
EN

Stack Overflow用户
提问于 2015-07-20 19:34:38
回答 2查看 2.1K关注 0票数 0

简而言之,我试图实现的确切效果是以下场景:

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

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

我如何达到类似的效果?

当我分别单击多个CTRL行时,DataGridView选择的行为就像是单击了DataGridView按钮一样。

如果这是不可能的(我在另一个项目中看到过:() )那么如何让DataGridViewRows在一次点击中被选中,如果还没有被选中就取消选中呢?

EN

回答 2

Stack Overflow用户

发布于 2015-07-20 19:39:21

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

票数 0
EN

Stack Overflow用户

发布于 2015-07-20 19:40:54

您可以尝试此简单的解决方法,而不必修改/继承DataGrid控件,方法是按如下所示处理预览鼠标按下事件:

代码语言:javascript
复制
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键保留为默认行为。

这个方法唯一的一个缺点是,你不能像最初那样点击和拖动来执行范围选择。但值得一试。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31515457

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档