Cat Zimmermann
Cat Zimmermann

Reputation: 1420

Only change a ListViewItem's Checked state if the checkbox is clicked

By default, double-clicking a ListViewItem toggles its Checked state. I only want the Checked state to be changed by clicking an the item's checkbox or pressing the space bar while an item is highlighted. Is this easy to do?

Upvotes: 6

Views: 4435

Answers (1)

jdehaan
jdehaan

Reputation: 19928

The solution involves 3 events and one state variable of type bool:

private bool inhibitAutoCheck;

private void listView1_MouseDown(object sender, MouseEventArgs e) {
    inhibitAutoCheck = true;
}

private void listView1_MouseUp(object sender, MouseEventArgs e) {
    inhibitAutoCheck = false;
}

private void listView1_ItemCheck(object sender, ItemCheckEventArgs e) {
    if (inhibitAutoCheck)
        e.NewValue = e.CurrentValue;
}

The item check enables to avoid the transition to another check state (called before the ItemChecked event). The solution is simple and sure.

To find it out I made a small test with different events:

When clicking:

  1. MouseDown <------------- inhibited region
  2. Click
  3. MouseClick
  4. MouseUp ------------->
  5. ItemCheck (outside inhibited region)
  6. ItemChecked

When double clicking:

  1. MouseDown <------------- inhibited region
  2. ItemSelectionChanged
  3. SelectedIndexChanged
  4. Click
  5. MouseClick
  6. MouseUp ------------->
  7. MouseDown <------------- inhibited region
  8. ItemCheck (inside inhibited region)
  9. ItemActivate
  10. DoubleClick
  11. MouseDoubleClick
  12. MouseUp ------------->

Upvotes: 16

Related Questions