Listviewitems austauschen

30/10/2008 - 20:09 von Thomas Hübner | Report spam
Hi NG,

ich habe eine Klasse welche als Eigenschaft unter anderem ein
Listviewitem zur Verfügung stellt. Mehrere Instanzen dieser Klasse
befinden sich in einer List. Des weiteren habe ich einen Listview in
Detailansicht der per Timer aktualisiert werden soll.

Bisher mache ich per Items.Clear den Listview leer und befülle Ihn neu
in dem ich die Liste durchgehe und mit Items.Add die Listitems aus den
Klassen einfüge. Das ist zwar einfach aber unpraktisch da der Listview
immer wieder an den Anfang scrollt (passiert beim Clear).

Ich suche eine praktikabele Möglichkeit die Listviewitems aus der List
mit dem Listview abzugleichen. Items(Klasse.ID) = Klasse.Listitem geht
nicht. Auch muß ein Item.Remove ausgeführt werden wenn die entsprechend
korospondierende Klasse nicht mehr in der Liste ist. Identifer ist
Klasse.ID = Item.Name.

Mit dem kompletten löschen des Listview hatte ich diese Probleme nicht,
da auf die Art immer genau der Inhalt der Liste dargestellt wurde - nur
leider sehr userunfreundlich da jedesmal wenn der Timerintervall den
Listview refresht die Scrollposition auf Anfang gesetzt wird (egal an
welche Stelle der User gerade gescrollt hat)

Ein Datagridview (mit dahinterliegender Datatable) hatte ich schon in
Erwàgung gezogen nur fehlt mir da die Group Eigenschaft.

Gruß,
Thomas
 

Lesen sie die antworten

#1 Peter Fleischer
01/11/2008 - 06:51 | Warnen spam
"Thomas Hübner" schrieb im Newsbeitrag
news:ged0pf$mp$

...
Mit dem kompletten löschen des Listview hatte ich diese Probleme nicht, da
auf die Art immer genau der Inhalt der Liste dargestellt wurde - nur
leider sehr userunfreundlich da jedesmal wenn der Timerintervall den
Listview refresht die Scrollposition auf Anfang gesetzt wird (egal an
welche Stelle der User gerade gescrollt hat)



Hi Thomas,
hast du dir mal den virtuellen Modus angeschaut? Nachfolgend mal eine kleine
Demo. Genutzt wird eine Liste von ListViewItems. Jedes Mal, wenn die Liste
veràndert wird, wird auch die Eigenschaft VirtualListSize geàndert. Diese
Zuweisung fordert das ListView-Steuerelement zum Neuzeichnen auf. In der
Demo ist nicht berücksichtigt, dass nach dem Löschen von Items die
selektierte Zeile auf dem ursprüblichen ListViewItem verbleibt. Man müsste
also etwas genauer deine Aufgabenstellung kennen, um die Oberflàche passend
zu gestalten.

Option Infer On
Option Strict On

Public Class Form1

Dim lv As New ListView With {.Dock = DockStyle.Fill, _
.View = View.Details, _
.LabelEdit = True, _
.AllowColumnReorder = True, _
.CheckBoxes = True, _
.FullRowSelect = True, _
.GridLines = True, _
.VirtualMode = True}

Dim liste As New List(Of ListViewItem)

Private Sub Form1_Load(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles MyBase.Load

Me.Controls.AddRange(New Control() {lv})
With lv
.Columns.Add("Spalte 1", 150, HorizontalAlignment.Left)
AddHandler .RetrieveVirtualItem, AddressOf lvRVI
End With

Dim t As New Timer With {.Interval = 200}
AddHandler t.Tick, AddressOf tTick
t.Start()

End Sub

Private Sub lvRVI(ByVal sender As Object, ByVal e As
RetrieveVirtualItemEventArgs)
e.Item = liste(e.ItemIndex)
End Sub

Private Sub tTick(ByVal sender As Object, ByVal e As EventArgs)
If lv.Items.Count > 100 And Rnd() > 0.5 Then
liste.RemoveAt(CInt(100 * Rnd()))
Else
Dim lvi As New ListViewItem(Now.ToString("HH:mm:ss.fff"))
liste.Add(lvi)
End If
lv.VirtualListSize = liste.Count
End Sub

End Class

Viele Grüsse
Peter

Ähnliche fragen