Я делаю пример для тех, кто еще не понял, что элементы управления, такие как ListBox
, не должны содержать строки; он хранил форматированные строки и прыгал через сложные синтаксические обручи, чтобы вернуть данные из ListBox
, и я хотел бы показать ему, что есть лучший способ.Как сделать ListBox обновить текст элемента?
Я заметил, что если у меня есть объект, сохраненный в ListBox
, то обновите значение, которое влияет на ToString
, ListBox
не обновляет себя. Я попытался позвонить Refresh
и Update
на элемент управления, но не работает. Вот код примера я использую, это требует, чтобы перетащить ListBox и кнопку на форму:
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
я подумал, что, возможно, проблема с использованием полей и попытался реализации INotifyPropertyChanged, но это не имел никакого эффекта. (Причина, по которой я использую поля, - это пример, и мне не хочется добавлять несколько десятков строк, которые не имеют ничего общего с темой, которую я демонстрирую.)
Честно говоря, я никогда не пробовал обновлять предметы на месте, как это раньше; в прошлом я всегда добавлял/удалял элементы, а не редактировал их. Поэтому я никогда не замечал, что я не знаю, как это сделать.
Так что мне не хватает?
Отлично. По какой-то причине привязка данных в WinForms никогда не выскакивает на меня как решение, независимо от того, насколько я использую его в WPF. – OwenP 2008-09-15 14:08:03
Хех это было еще веселее, чем это. Что-то вроде: ((CurrencyManager) this.BindingContext [ListBox1]). Обновить(); Получение «скрытого» объекта из BindingContext, а затем отведение его в диспетчер валюты. Хотя это C#, поскольку я никогда не делал этого в VB.NET. – Quibblesome 2008-09-15 15:55:43
Это хороший ответ, но в конечном итоге предложение Geno использовать BindingList приводит к меньшему количеству работы. –
OwenP
2010-01-26 16:28:30