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

时间:2015-07-20 11:34:38

标签: c# winforms datagridview multi-select deselect

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

你有一个带有几行的DataGridView,而DataGridView.MultiSelect属性设置为true。

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

我如何实现类似的影响?

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

如果那是不可能的(我已在另一个项目中看到它:()那么如何在一次点击时选择DataGridViewRows,如果尚未选择则取消选择?

2 个答案:

答案 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保持为默认行为。

此方法只有一个缺点是您无法点击并拖动以执行最初的范围选择。但值得一试。