我正在为一个还没有意识到像ListBox
这样的控件不必包含字符串的人举个例子;他一直在存储格式化的字符串,并跳过复杂的解析环节,以获取数据返回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的,但这没有效果。 (我使用字段的原因是因为它是一个例子,我不想添加与我正在演示的主题无关的几十行。)
老实说我从来没有试过更新项目就像这样;在过去,我一直在添加/删除项目,而不是编辑它们。所以我从来没有注意到我不知道如何完成这项工作。
那么我错过了什么?
优秀。出于某种原因,WinForms中的数据绑定永远不会跳出我的解决方案,无论我在WPF中使用多少。 – OwenP 2008-09-15 14:08:03
呵呵,它曾经比这更有趣。例如: ((CurrencyManager)this.BindingContext [ListBox1])。Refresh(); 从BindingContext获取“隐藏”对象,然后将其转换为货币经理。 尽管这是C#,因为我从来没有在VB.NET中这样做过。 – Quibblesome 2008-09-15 15:55:43
这是一个很好的答案,但最终geno建议使用BindingList会导致较少的工作。 –
OwenP
2010-01-26 16:28:30