Я делаю пример для кого-то, кто еще не осознал, что элементы управления типа ListBox
не должны содержать строки; он хранил отформатированные строки и перепрыгивал через сложные разборы, чтобы получить данные обратно из ListBox
, и я хотел бы показать ему, что есть лучший способ.
Я заметил, что если у меня есть объект, сохраненный в ListBox
, то обновите значение, которое влияет на ToString
, ListBox
не обновится сам. Я пытался вызвать Refresh
и Update
на контроле, но ни один не работает. Вот код примера, который я использую, он требует, чтобы вы перетащили список и кнопку на форму:
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 , но это не дало никакого эффекта. (Причина, по которой я использую поля, заключается в том, что это пример, и мне не хочется добавлять несколько десятков строк, которые не имеют ничего общего с темой, которую я демонстрирую.)
Честно говоря, я никогда не пробовал обновлять элементы на месте, как это раньше; В прошлом я всегда добавлял / удалял элементы, а не редактировал их. Поэтому я никогда не замечал, что не знаю, как заставить это работать.
Так чего мне не хватает?