简而言之,我试图实现的确切效果是以下场景:
您有一个包含两行且DataGridView.MultiSelect属性设置为true的DataGridView。
如果按住CTRL键并单击行,您不仅可以选择行,甚至可以取消选择已经选择的行-但如果不按住CTRL键,则无法执行此操作。
我如何达到类似的效果?
当我分别单击多个CTRL行时,DataGridView选择的行为就像是单击了DataGridView按钮一样。
如果这是不可能的(我在另一个项目中看到过:() )那么如何让DataGridViewRows在一次点击中被选中,如果还没有被选中就取消选中呢?
发布于 2015-07-20 19:39:21
您可以对(主窗体的) KeyDown和KeyUp事件使用布尔变量来检查是否按下了Ctrl键,然后处理来自CellContentClick或任何其他事件的行索引(它传递行和列索引,可用于设置Selected属性)。只需执行一个if子句,它将检查是否设置了CTRL pressed布尔变量,然后执行您的操作。
发布于 2015-07-20 19:40:54
您可以尝试此简单的解决方法,而不必修改/继承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键保留为默认行为。
这个方法唯一的一个缺点是,你不能像最初那样点击和拖动来执行范围选择。但值得一试。
https://stackoverflow.com/questions/31515457
复制相似问题