我正在为一个还没有意识到类似 ListBox
控件不必只包含字符串的人做一个示例;他一直在存储格式化字符串,并且通过复杂的解析过程来获取数据。我想向他展示有更好的方法。
我注意到,如果我在 ListBox
中存储了一个对象,然后更新一个影响 ToString
的值,ListBox
不会自动更新。我尝试在控件上调用 Refresh
和 Update
方法,但都不起作用。这是我使用的示例代码,它需要你将一个 listbox 和一个 button 拖放到窗体上:
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接口,但这并没有起作用。(之所以使用字段是因为这只是一个例子,我不想添加几十行与我正在演示的主题无关的代码。)
老实说,我以前从未尝试过像这样直接更新项目;过去我总是添加/删除项目,而不是编辑它们。所以我从来没有注意到我不知道如何使它正常工作。
那么我错过了什么?