J'ai besoin de sélectionner tous les éléments d'une liste lorsqu'une Case est cliqué. Est-il possible de sélectionner tous les éléments dans la zone de liste à l'aide d'une seule ligne de code? Ou vais-je devoir faire une boucle par tous les éléments et sélectionné pour chacun d'eux?
Merci 🙂
Je pense que vous avez à boucle ici. Sélection de tous les éléments à la fois est assez spécifique (et probablement rares) cas d'utilisation où il fait tout simplement pas de sens pour proposer cette fonctionnalité de la boîte. En outre, la boucle sera juste deux lignes de code, de toute façon.
Le fait est que
ListBox.Items
est un simple objet la collecte et le rendement brut non typée objets, qui ne peut pas être multi-sélectionné (par défaut).Si vous voulez multi-sélectionner tous les éléments, puis ce sera le travail:
Aussi loin que je peux dire, en utilisant l'un de la .NET méthodes pour sélectionner un grand nombre d'éléments est beaucoup plus lent que de faire un direct PInvoke appel, en passant la LB_SETSEL message (0x185) pour le contrôle, avec un drapeau indiquant si vous souhaitez Sélectionner (1) ou Désélectionner (0) ainsi que la magie de la valeur (-1) qui indique que le changement doit s'appliquer à tous les éléments.
SelectedItems[SelectedItems.Count - 1]
IndexOutOfRange exception est levée. Semble que les éléments sont sélectionnés, mais zone de liste n'actualise les listes internes avec eux. Pour calculerSelectedObjectCollection.Count
propriété de lecture envoie un autre message de fenêtre qui renvoie compte de tous les éléments.Application.DoEvents
) après l'exécution de la sélection.J'ai vu un certain nombre de (même) les réponses à toutes qui ne, logiquement, la même chose, et j'ai été déconcerté pourquoi pourtant, tous ne fonctionnent pas pour moi. La clé est le réglage de zone de liste de
SelectionMode
àSelectionMode.MultiSimple
. Il ne fonctionne pas avecSelectionMode.MultiExtended
. Compte tenu de sélectionner plusieurs éléments dans une zone de liste, vous aurez le mode de sélection de l'ensemble des multiples de la mode, et la plupart des gens aller pour les classiquesMultiExtended
de style, cette réponse devrait aider beaucoup. Et ya pas unforeach
, maisfor
.Vous devriez vraiment faire ceci:
OU
e.SuppressKeyPress = true;
, il doit travailler, quel que soit le SelectionMode.- Je utiliser Mika est une solution, mais cela peut être très lent si vous avez des milliers d'articles. Pour une augmentation de la vitesse massif, vous pouvez désactiver la visibilité brièvement. La zone de liste ne sera pas réellement disparaître au cours de l'opération, comme vous vous en doutez, mais la sélection se fait au moins 10 fois plus rapide dans mon cas.
myListBox.Visible = false
est plus rapide car elle évite de dessin pendant la mise à jour. Je voudrais utiliser les méthodesmyListBox.BeginUpdate()
etmyListBox.EndUpdate()
🙂Au sein de ce Constructeur, vous devez activer le multi de sélection de mode (
MultiExtended
), de la zone de texte.Après cela, utiliser une boucle pour tout sélectionner:
Je l'ai testé. Elle fonctionne. Vous pouvez également utiliser le [CTRL/SHIFT] enfoncée + clic gauche pour sélectionner les éléments individuellement.
Sélectionnez Tous les est vraiment disponible hors de la boîte:
Je sais que cette question est taggés avec .NET 2.0, mais si vous avez LINQ disponible pour vous en 3.5+, vous pouvez effectuer les opérations suivantes:
using System.Web.UI.WebControls;
? Êtes-vous le référencement de l'assemblée?De réponses mis à jour pour faire référence à l'assemblée.ce n'est absolument pas agréable, mais beaucoup plus rapide qu'une boucle si vous avez de nombreux de nombreux (+de 100) éléments:
Sélectionnez la zone de liste et de simuler la saisie de la clé de [la maison] et [shift]+[fin]
EDIT: fonctionne avec SelectionMode.MultiExtended seulement je suppose que
DoubleEDit: aussi être conscient que cela peut-être trop lent pour le code à l'aide de la lb.selecteditems par la suite, mais il peut être utile pour un bouton [Tout Sélectionner] que l'utilisateur va cliquer.
Dans mon cas, j'avais 10k+ éléments, la base de la méthode de boucle a été de prendre presque une minute pour terminer. À l'aide de @DiogoNeves réponse et en l'étendant je voulais être en mesure de sélectionner tout (Ctrl+A) & copier (Ctrl+C). j'ai géré cette 2 façons. j'ai utilisé le BeginUpdate() et EndUpdate() pour reporter le dessin, mais j'ai aussi ajouté une copie directe tout (Ctrl+Maj+C) qui ne prend même pas la peine de sélectionner les éléments avant de les copier.
J'ai ajouté nawfal idée de ce que j'avais déjà, qui était aussi avec 'BeginUpdate'. De plus la position de la vue est maintenu trop, que l'utilisateur pourrait s'attendre. Pour moi, cela semble résoudre tous les problèmes maintenant: