Comment puis-je faire une ListBox actualiser son texte d'un élément?
Je suis en train de faire un exemple pour quelqu'un qui n'a pas encore réalisé que les commandes comme ListBox
n'avez pas à contenir des chaînes; il avait été le stockage formaté de cordes et de sauter à travers compliqué l'analyse des cerceaux pour obtenir les données de retour de l' ListBox
et j'aimerais lui montrer il ya une meilleure façon.
J'ai remarqué que si j'ai un objet stocké dans la ListBox
ensuite mettre à jour une valeur qui affecte ToString
, le ListBox
ne pas se mettre à jour. J'ai essayé d'appeler Refresh
et Update
sur le contrôle, mais aucun ne fonctionne. Voici le code de l'exemple que j'utilise, cela nécessite que vous faites glisser un contrôle listbox et un bouton sur le formulaire:
Public Class Form1
Protected Overrides Sub OnLoad(ByVal e As System.EventArgs)
MyBase.OnLoad(e)
For i As Integer = 1 To 3
Dim tempInfo As New NumberInfo()
tempInfo.Count = i
tempInfo.Number = i * 100
ListBox1.Items.Add(tempInfo)
Next
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
For Each objItem As Object In ListBox1.Items
Dim info As NumberInfo = DirectCast(objItem, NumberInfo)
info.Count += 1
Next
End Sub
End Class
Public Class NumberInfo
Public Count As Integer
Public Number As Integer
Public Overrides Function ToString() As String
Return String.Format("{0}, {1}", Count, Number)
End Function
End Class
J'ai pensé que peut-être que le problème a été en utilisant les champs de et a essayé de mise en œuvre INotifyPropertyChanged, mais cela n'a eu aucun effet. (La raison pour laquelle je suis à l'aide de champs, parce que c'est un exemple et je n'ai pas envie d'ajouter quelques dizaines de lignes qui n'ont rien à voir avec le sujet je suis démontrer.)
Honnêtement, je n'ai jamais essayé la mise à jour des articles dans ce genre d'endroit avant; dans le passé, j'ai toujours été l'ajout/suppression d'éléments, ne pas les modifier. Donc, je n'ai jamais remarqué que je ne sais pas comment faire ce travail.
Donc ce qui me manque?
Vous devez vous connecter pour publier un commentaire.
BindingList gère la mise à jour les liaisons par lui-même.
- Je utiliser cette classe lorsque j'ai besoin d'avoir une zone de liste que les mises à jour.
Mise à jour de l'objet dans la liste et ensuite appeler les méthodes, en fonction de si vous avez l'indice est disponible ou non. Si vous êtes à la mise à jour d'un objet qui est contenue dans la liste, mais vous n'avez pas l'index, vous devrez appeler RefreshItems et mise à jour de tous les éléments.
RefreshItem
ne fonctionne que si leDisplayMember
propriété est définie.DataSource
de la propriété.Utiliser la propriété source de données et un BindingSource objet entre la source de données et la propriété datasource du contrôle listbox. Puis actualisez cette.
mise à jour ajout de l'exemple.
Comme suit:
Si vous dérivez de zone de liste il y a le RefreshItem méthode protégée que vous pouvez appeler. Tout simplement ré-exposer cette méthode dans votre propre type.
Puis modifiez votre fichier de concepteur d'utiliser votre propre type (dans ce cas, ListBox2).
C'est un peu un manque de professionnalisme, mais il fonctionne.
J'ai supprimé et ajouté l'article (également sélectionné à nouveau).
La liste est triée en fonction "d'afficher et de modifier la propriété" donc, encore une fois, a été très bien pour moi. L'effet secondaire est que l'augmentation des cas (indice changé) est soulevée.
Si vous utilisez une méthode de tirage comme:
Capteur est ma classe.
Donc si je change la classe
Color
quelque part, vous pouvez simplement mettre à jour:Et la
Color
de mettre à jour, juste une autre solution 🙂Je ne sais pas beaucoup sur vb.net mais en C#, vous devez utiliser la source de données, puis de les lier en appelant
listbox.bind()
ferait l'affaire.Si objLstTypes est de votre zone de liste nom de
Utilisation
objLstTypes.Éléments.Refresh();
Espérons que cela fonctionne...