Jag försöker lägga till flera rader samtidigt genom AddRange men jag lyckas inte göra det. Jag hittar heller inte något exempel på nätet. Om du vet hur många så är en array enklast och effektivast: Jag vet inte hur många rader som ska läggas till. Sen så måste jag kunna ange en key för varje rad, jag kan inte se att det är möjligt med ditt exempel? Vad är din källa, en databas? Det är en databas ja. Jag gör flera sökningar i den och därför vet jag inte från början hur många det kommer att bli totalt. Givetvis kan jag göra några SELECT COUNT() först för att få reda på det, men det känns inte helt optimalt. Nu har jag kommit lite längre, man var tydligen tvungen att ange en owner-Listview när man dimmade sin ListViewItemCollection. Du kopplar din collection till listviewn. Så du behöver därför inte göra någon AddRange. Eftersom detta skulle få den att lägga till samma objekt två gånger. Att lägga till dom på vanligt sätt tar för lång tid. Jag läste att AddRange var det bästa sättet för att lägga till många rader. Jag har inte testat den så att jag vet om prestandan är bättre eller inte, för det går inte att ange någon Key för raderna och det är nödvändigt. Jag tror det är egenskapen Name du söker. Ah, fantastiskt! Ditt exempel fungerar perfekt och är otroligt mycket snabbare! Dessutom så har jag ofta haft problem med Key-egenskapen och nu har du löst det också.ListView AddRange
Nån här som vet hur man gör?
ThomasSv: ListView AddRange
Dim Item As ListViewItem
Dim Items(9) As ListViewItem
Dim I As Integer
For I = 0 To 9
Item = New ListViewItem
Item.Text = String.Format("Item {0}", I)
Items(I) = Item
Next
ListView1.Items.AddRange(Items)
</code>
Sv:ListView AddRange
ThomasSv: ListView AddRange
Mitt exempel är bara en stub. I Din loop så fyller du i de egenskaper du vill ha.Sv:ListView AddRange
Nu när jag skriver det här så kom jag på att jag inte nödvändigtvis behöver lägga till alla direkt, utan kan lägga till raderna en gång per sökning, så då är det problemet löst.
Hur som helst så är Key-problemet kvar. En ListViewItem har ingen Key. Den verkar bara kunna anges när man lägger till en ListViewItem i ListViewn.
Dom exempel jag har sett på nätet nämner ListViewItemCollection, och när man lägger till objekt i den så kan man ange Key. Men jag har inte lyckats få ListViewItemCollection att fungera med AddRange.
ThomasSv: ListView AddRange
<code>
Dim AllItems As New ListView.ListViewItemCollection(ListView1)
AllItems.Add(Key, Text ImageIndex)
ListView1.AddRange(AllItems)
</code>
Jag lägger givetvis till fler items och dom kommer från en databas. Men på AddRange får jag ett fel:
<info>
Det går inte att lägga till eller infoga elementet Hej på mer än en plats. Du måste först ta bort det från den aktuella platsen eller klona det.
Parameternamn: item
</info>
"Hej" är texten för en item i AllItems. Eventuellt finns "Hej" med flera gånger i databasen, men jag använder ID:t som Key så det är garanterat unikt.
Vad kan vara fel?
ThomasSv:ListView AddRange
Varför kan du int använda:
ListView.Itmes.Add(item)
Alternativt om du vill lägga till alla i ett svep:
Dim Item As ListViewItem
Dim Items As New System.Collections.Generic.List(Of ListViewItem)
Dim I As Integer
For I = 0 To 10
Item = New ListViewItem
Item.Text = String.Format("Item {0}", I)
Items.Add(Item)
Next
ListView1.Items.AddRange(Items.ToArray())
Sv: ListView AddRange
Det fungerar nu när jag använder ListViewItemCollection utan AddRange, men då är frågan, blir det verkligen någon prestandavinst? Nu känns det som att jag lägger till raderna en och en igen.
ThomasSv: ListView AddRange
ThomasSv:ListView AddRange
<info>
Remarks
----------
If the ListView is sorted, the item is added in the correctly sorted order; otherwise, it is added to the end of the collection. The Name property corresponds to the key for a ListViewItem in the ListView.ListViewItemCollection.
The Add method sets the Name property to the specified key, so the item can be retrieved by its index or by key.
</info>
http://msdn2.microsoft.com/en-us/library/ba9b96ey.aspx
Så för att ange en nyckel sätt bara name-egenskapen:
Function ToKey(ByVal id As Integer) As String
Return String.Format("Key{0:0000}", id)
End Function
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim Item As ListViewItem
Dim Items As New System.Collections.Generic.List(Of ListViewItem)
Dim I As Integer
For I = 1001 To 1010
Item = New ListViewItem
Item.Name = ToKey(I)
Item.Text = String.Format("Item {0}", I)
Items.Add(Item)
Next
ListView1.Items.AddRange(Items.ToArray())
Dim key As String = ToKey(1003)
Item = ListView1.Items(key)
Item.Selected = True
End Sub
Du behöver inget prefix i nyckeln som jag har i exemplet och vilket var tvungen i vb6 för numeriska värden:
Function ToKey(ByVal id As Integer) As String
Return id.ToString
End Function
Funkar lika väl.
Sv: ListView AddRange
Det enda som jag funderar på nu är varför dom har valt att döpa den till Name när den heter Key annard?
Thomas