Interdit à ListView d’avoir zéro élément sélectionné

Mon projet est .NET / WinForms.

J’ai une vue de liste qui est toujours remplie d’éléments. Je voudrais qu’il ait toujours une sélection. Cependant, si je clique sur une zone vide sous les éléments de la liste, la sélection est perdue.

La liste a plusieurs sélections = vrai et masquer séléction = faux.

Vous devez empêcher le contrôle natif de voir le clic de la souris pour ne pas désélectionner un élément. Ajoutez une nouvelle classe à votre projet et collez le code ci-dessous. Comstackr. Déposez-le du haut de la boîte à outils sur votre formulaire, remplaçant celui existant.

using System; using System.Drawing; using System.Windows.Forms; class MyListView : ListView { protected override void WndProc(ref Message m) { // Swallow mouse messages that are not in the client area if (m.Msg >= 0x201 && m.Msg <= 0x209) { Point pos = new Point(m.LParam.ToInt32()); var hit = this.HitTest(pos); switch (hit.Location) { case ListViewHitTestLocations.AboveClientArea : case ListViewHitTestLocations.BelowClientArea : case ListViewHitTestLocations.LeftOfClientArea : case ListViewHitTestLocations.RightOfClientArea : case ListViewHitTestLocations.None : return; } } base.WndProc(ref m); } } 

Comme d’autres l’ont déjà dit, l’événement SelectedIndexChanged est ce que vous devez rechercher. Cependant, vous devez l’utiliser en collaboration avec l’événement ItemSelectionChanged . Voici un code que je viens de cuisiner:

 // Holds the last selected index private int _previousIndex = -1; // Restores the previous selection if there are no selections private void listView1_SelectedIndexChanged(object sender, EventArgs e) { if (listView1.SelectedIndices.Count == 0) { if (_previousIndex >= 0) { listView1.SelectedIndices.Add(_previousIndex); } } } // Records the last selected index private void listView1_ItemSelectionChanged(object sender, ListViewItemSelectionChangedEventArgs e) { if (e.IsSelected) { _previousIndex = e.ItemIndex; } } 

Pour des raisons de réutilisation de code pur, il serait probablement intéressant de placer ce code dans un nouveau UserControl et d’avoir une propriété qui détermine s’il faut autoriser ou non la perte de la dernière sélection:

 public class CustomListView : ListView { protected CustomListView() { this.SelectedIndexChanged += new EventHandler(CustomListView_SelectedIndexChanged); this.ItemSelectionChanged += new ListViewItemSelectionChangedEventHandler(CustomListView_ItemSelectionChanged); } void CustomListView_SelectedIndexChanged(object sender, EventArgs e) { if (this.MaintainLastSelection && this.SelectedIndices.Count == 0) { if (_previousIndex >= 0) { this.SelectedIndices.Add(_previousIndex); } } } void CustomListView_ItemSelectionChanged(object sender, ListViewItemSelectionChangedEventArgs e) { if (e.IsSelected) { _previousIndex = e.ItemIndex; } } private int _previousIndex = -1; public bool MaintainLastSelection { get { return _maintainLastSelection; } set { _maintainLastSelection = value; } } private bool _maintainLastSelection; } 

Ce qui suit fonctionne si vous n’avez pas besoin de multisélectionner. Il présente l’avantage de ne pas avoir besoin de suivre quel élément a été sélectionné en dernier.

 private void ListViewAny_SelectedIndexChanged(object sender, EventArgs e) { if ((sender as ListView).FocusedItem != null) { (sender as ListView).FocusedItem.Selected = true; } } 
  private void LV_MouseUp(object sender, MouseEventArgs e) { if (LV.FocusedItem != null) { if (LV.SelectedItems.Count == 0) LV.FocusedItem.Selected = true; } } 

(pas de multisélection)

Vous devez gérer l’événement SelectedIndexChanged du ListView et, dans le cas où aucun élément n’est sélectionné après que cet événement se soit produit, sélectionnez à nouveau par programme la dernière sélection connue.

Le ListView a un événement SelectedIndexChanged . Écoutez ceci, puis interrogez la propriété listView.SelectedItems.Count . Si la valeur est zéro, sélectionnez le premier / le dernier élément sélectionné.