简而言之,我试图实现的确切效果是以下情况:
你有一个带有几行的DataGridView,而DataGridView.MultiSelect属性设置为true。
如果按住CTRL并单击行,则不仅可以选择行,甚至可以取消选择已选择的行 - 但如果不保持控制,则无法执行此操作。
我如何实现类似的影响?
当我单击多个DataGridView行(单独)时,DataGridView选择的行为就像点击了CTRL按钮一样。
如果那是不可能的(我已在另一个项目中看到它:()那么如何在一次点击时选择DataGridViewRows,如果尚未选择则取消选择?
答案 0 :(得分:0)
您可以在KeyDown和KeyUp事件(主窗体)上使用bool变量来检查是否按下了CTRL,然后从CellContentClick或任何其他事件(传递Row和Column索引)处理行索引,可用于设置Selected属性)。只需执行一个if子句,它检查是否设置了CTRL按下的bool变量,然后执行你的操作。
答案 1 :(得分: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保持为默认行为。
此方法只有一个缺点是您无法点击并拖动以执行最初的范围选择。但值得一试。