Search code examples
c#winformslistviewkeyboardkeystroke

Override default behavior of SPACE key in .net WinForms ListView


I'd like to implement some custom behavior of Space key in a ListView. Basically I'd like to toggle selected status of the item under cursor - that should be fairly simple

this.FocusedItem.Selected = !this.FocusedItem.Selected;

but alas, it also does the default action, which is to select the focused item. This way I am unable to 'unselect' the focused item. I've looked for similar problems and they suggest using PreviewKeyDown event, in which I would process the key and disallow the ListView to do its default action. But the PreviewKeyDown event argument has no "handled" property, so I cannot 'eat' this key.


Solution

  • This worked as you wanted:

    private void listView1_KeyDown(object sender, KeyEventArgs e) {
      if (e.KeyData == Keys.Space) {
        listView1.FocusedItem.Selected = !listView1.FocusedItem.Selected;
        e.Handled = e.SuppressKeyPress = true;
      }
    }