Comment changer listview ligne sélectionnée backcolor même lorsque la mise au point sur un autre contrôle?
J'ai un programme qui utilise un scanner de codes barres comme périphérique d'entrée ce qui signifie que j'ai besoin de garder le focus sur une zone de texte.
Le programme dispose d'un contrôle listview et j'sélectionnez l'un des éléments par programmation lorsqu'un certain code à barres est scanné. - Je définir la couleur d'arrière-plan de la ligne:
listviewitem.BackColor = Color.LightSteelBlue;
Choses que j'ai essayé:
listview.HideSelection
définie sur false- appel
listview.Focus()
après le réglage de la couleur listviewitem.Focused
true- appel
listview.Invalidate
- appel
listview.Update()
- appel
listview.Refresh()
- différentes combinaisons de ce qui précède
J'ai aussi fait des combinaisons de trucs ci-dessus dans une minuterie de sorte qu'ils sont appelés sur un autre fil, mais toujours sans succès.
Des idées?
Plus d'infos:
- La clé ici est la mise au point. Le contrôle listview n'a pas le focus lors de la sélection d'un des éléments.
-
Je sélectionner un élément en faisant:
listView1.Items[index].Selected = true;
-
l'Accent est toujours dans la zone de texte.
- l'ordinateur ne dispose pas de clavier ou de la souris, seulement un lecteur de code à barres.
J'ai ce code à garder le focus sur la zone de texte:
private void txtBarcode_Leave(object sender, EventArgs e)
{
this.txtBarcode.Focus();
}
Vous avez besoin d'avoir une zone de texte ajouter ce code pour simuler mon problème.
- Cant comprendre le problème. Code
listView1.Items[0].BackColor = Color.LightSteelBlue;
fonctionne bien. Qu'essayez-vous de réaliser, mais ne peux pas? - Ma conjecture est que le Windows par défaut en surbrillance de la sélection est primordial de votre couleur de fond personnalisée. Il est vraiment impossible de dire: votre question est très floue de ce qu'est le véritable problème.
- J'ai hilighted la principale clé du problème. Merci les gars pour regarder ma question.
Vous devez vous connecter pour publier un commentaire.
Ce que vous décrivez œuvres exactement comme prévu, en supposant que vous avez défini la
HideSelection
propriété de laListView
de contrôle à False. Voici une capture d'écran pour les besoins de la démonstration. J'ai créé un projet vide, ajouté unListView
de contrôle et unTextBox
contrôle à un formulaire, ajout de quelques éléments de l'échantillon à laListView
, définir son point de vue sur "Détails" (bien que cela fonctionne dans n'importe quelle vue), et de définirHideSelection
à false. J'ai manipulé laTextBox.Leave
manifestation tout comme vous l'a montré dans la question, et a ajouté une logique simple pour sélectionner leListViewItem
chaque fois que son nom a été inscrit dans leTextBox
. Avis que "l'Élément d'Essai de Six" est sélectionné dans laListView
:Maintenant, comme je le soupçonnais d'abord, vous allez gâcher les choses, si vous allez monkeying autour avec réglage de la
BackColor
propriété vous-même. Je ne sais pas pourquoi vous ne pourriez jamais vouloir pour ce faire, le contrôle utilise déjà la valeur par défaut de sélection des couleurs pour indiquer les éléments sélectionnés par défaut. Si vous souhaitez utiliser différents couleurs, vous devriez changer votre thème Windows, plutôt que d'essayer d'écrire le code pour le faire.En fait, si j'ajoute la ligne
item.BackColor = Color.LightSteelBlue
en plus de mon code existant pour sélectionner leListViewItem
correspondant au nom tapé dans l'TextBox
, je reçois exactement la même chose, comme indiqué ci-dessus. La couleur d'arrière-plan de l'élément ne change pas jusqu'à ce que vous mettez le focus sur le contrôle. C'est le devrait comportement, car les éléments sélectionnés look différent quand ils ont l'accent que lors de leur contrôle parent est floue. Les éléments sélectionnés concernant l'accent mis sur les contrôles sont peints avec le système de couleur de surbrillance; les éléments sélectionnés sur le flou des contrôles sont peints avec le système 3D couleur. Autrement, il serait impossible de dire si oui ou non leListView
de contrôle a le focus. En outre, tous lesBackColor
propriété est complètement ignoré par le système d'exploitation lorsque leListView
de contrôle a le focus. L'arrière-plan est peinte par défaut dans le système de couleur de surbrillance.Mettant explicitement l'accent sur la
ListView
de contrôle, bien sûr, les causes de la couleur de fond personnalisée pour être appliqué à laListViewItem
, et les choses de rendu avec une couleur qui contraste avec le schéma de couleur que j'ai choisi sur mon ordinateur (rappelez-vous, pas tout le monde utilise les valeurs par défaut). Le problème, cependant, devient immédiatement évident: vous ne pouvez pas définir le focus à laListView
contrôle parce que le code que vous avez écrit dans leTextBox.Leave
méthode de gestionnaire d'événement!Je peux vous dire dès maintenant que le réglage de la mise au point d'une focus événement qui change est la mauvaise chose à faire. C'est une règle absolue dans Windows, vous n'êtes pas autorisé à faire des choses comme ça, et le la documentation même vous avertit explicitement de ne pas le faire. Sans doute, votre réponse sera quelque chose le long des lignes de "je", mais ce n'est pas une excuse. Si tout fonctionne comme prévu, vous ne seriez pas poser cette question en premier lieu.
Alors, que faire maintenant? Votre conception est cassé. Je suggère de le fixer. N'essayez pas de singe avec réglage de la
BackColor
propriété vous-même pour indiquer qu'un élément est sélectionné. Il est en conflit avec la méthode par défaut de Windows qui souligne les éléments sélectionnés. Aussi, n'essayez pas de les placer le focus dans un centre-évolution de l'événement. Windows interdit explicitement de cette, et la documentation est clair que vous n'êtes pas censé le faire. Si l'ordinateur cible ne dispose pas d'une souris ou d'un clavier, il est difficile de savoir comment l'utilisateur va se concentrer sur autre chose, en premier lieu, sauf si vous écrivez le code pour le faire, qui vous ne devriez pas faire.Mais j'ai étonnamment peu de foi que vous aurez envie de réparer votre application. Les gens qui ignorent les avertissements dans la documentation ont tendance à être les mêmes personnes qui n'écoutent pas les conseils bien intentionnés sur Q&Un des sites. Donc je vais vous jeter un os et vous dire comment faire pour obtenir l'effet que vous désirez tout de même. La clé se trouve dans le pas de réglage de la
ListViewItem
'sSelected
de la propriété, ce qui évite le conflit entre personnalisé de votreBackColor
et le système par défaut de la couleur de surbrillance. Il libère également vous éviter d'avoir à définir explicitement l'accent sur laListView
de contrôle et de retour à nouveau (ce qui, comme nous l'avons établi ci-dessus, n'est-ce pas ce qui se passe réellement, compte tenu de votreLeave
méthode de gestionnaire d'événement). Faire qui produit le résultat suivant:Et voici le code c'est pas très jolie, mais c'est juste une preuve de concept, pas un exemple de bonne pratique:
Un standard
ListView
ne vous permettent pas de définir la couleur d'arrière-plan d'un sélectionné ligne. L'arrière-plan (et au premier plan), les couleurs des une ligne sélectionnée sont toujours contrôlées par le thème de l'OS.Vous avez à propriétaire attirer votre
ListView
pour contourner ce problème, OU vous pouvez utiliser ObjectListView. ObjectListView est un wrapper autour de .NET WinForms ListView, ce qui en fait beaucoup plus facile à utiliser, ainsi que facilement permettant de choses qui sont très difficiles normale dans un ListView -- comme modifié les couleurs des lignes sélectionnées.Cela montre la ObjectListView quand il ne pas ont le focus.
Sur
SelectedIndexChanged
:Voici une solution pour une ListView qui ne pas autoriser les sélections multiples et
ne pas avoir des images (par exemple, des cases à cocher).
dans cet exemple, il est nommé gListView1LostFocusItem) et affectez-lui la valeur -1
Mettre en œuvre les gestionnaires d'événements comme suit:
Remarque: Cette solution entraînera un certain scintillement. Un correctif pour ce implique de sous-classement de la liste de contrôle de sorte que vous
pouvez modifier la propriété protégée DoubleBuffered de vrai.
Vous ne pouvez pas définir le focus sur le contrôle listview dans cette situation.
txtBarcode_Leave
méthode de l'en empêcher. Mais si vous avez le désir d'être en mesure de sélectionner des éléments listview en cliquant sur eux, il suffit d'ajouter le code ci-dessous pourMouseClick
gestionnaire d'événement de listview:Il suffit de faire comme ceci:
Bonne chance 🙂