Hej. Jag har en listbox som innehåller x antal objekt av typen Person. Person klassen innehåller fälten namn, efternamn osv. I den kör jag metoden ToString, som jag overridar. Dvs att min toString metod körs när listboxen ritas upp. Här är en lösning som borde fungera: OK. Tack för svaret. Det fungerar perfekt. Vet dock inte riktigt varför? Är det så att listboxen "refreshas" ifall man gör följande operation:Listbox innehållande instanser av en klass (objekt)
Hur skall jag få listboxen att uppdateras när jag har gjort ändringar i någor av objekten i listan? Jag ändrar kanske på ett namn, och trycker på uppdatera. Ändringen syns ifall jag kikar på objektet i en editeringsvy, men inte i listboxen. Jag måste ju kunna refresha listan på något sätt, eller hur? Objekten finns för tillfället inte i någon databas, utan skrivs bara in när programmet startas, och lagras i Listboxen.
<code>
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim i As Integer
For i = 0 To 20
lstPersons.Items.Add(New Person("Person " & i, "Efternamn " & i, DateTime.Now().AddDays(Double.Parse(i.ToString())).ToString()))
Next
End Sub
Public Class Person
Private m_firstname As String
Private m_lastname As String
Private m_birthday As DateTime
Public Sub New(ByVal firstname As String, ByVal lastname As String, ByVal birthday As DateTime)
m_firstname = firstname
m_lastname = lastname
m_birthday = birthday
End Sub
Public Overrides Function ToString() As String
Return m_firstname & " " & m_lastname & ". " & m_birthday
End Function
Public Property firstname() As String
Get
Return m_firstname
End Get
Set(ByVal Value As String)
m_firstname = Value
End Set
End Property
Public Property lastname() As String
Get
Return m_lastname
End Get
Set(ByVal Value As String)
m_lastname = Value
End Set
End Property
Public Property birthday() As String
Get
Return m_birthday
End Get
Set(ByVal Value As String)
m_birthday = Value
End Set
End Property
End Class
</code>Sv: Listbox innehållande instanser av en klass (objekt)
Lägg till ett event i Person och 'raisa' det vid uppdatering av de olika fälten som visas i drop-boxen.
<code>
Public Class Person
Public Event DisplayValueChanged(ByVal Person As Person)
Public Property firstname() As String
Get
Return m_firstname
End Get
Set(ByVal Value As String)
m_firstname = Value
RaiseEvent DisplayValueChanged(Me)
End Set
End Property
</code>
I din load funktion lägger du till event-handlers för alla personer:
<code>
Dim i As Integer
Dim Person as Person
For i = 0 To 20
Person= New Person("Person " & i, "Efternamn " & i, DateTime.Now().AddDays(Double.Parse(i.ToString())).ToString())
addhandler Person.DisplayValueChanged, addressof ItemChange
lstPersons.Items.Add(Person)
Next
</code>
Och sedan denna sub i formuläret:
<code>
Private sub ItemChange(Person as Person)
Dim i As Integer
For i = 0 To ComboBox1.Items.Count - 1
If ComboBox1.Items(i) Is Person Then
ComboBox1.Items(i) = ComboBox1.Items(i)
Exit For
End If
Next
End sub
</code>
Med vänliga hälsningar
Peter IlisSv:Listbox innehållande instanser av en klass (objekt)
<code>
ComboBox1.Items(i) = ComboBox1.Items(i)
</code>
mvh,
Philip