Listview füllen und Daten aktualisieren, aber geschmeidig :-)

  • VB.NET

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von timonator.

    Listview füllen und Daten aktualisieren, aber geschmeidig :-)

    Hallo,

    wie man ein Listview befüllt ist mir soweit klar.
    ich habe das bisher - in diesem projekt - so gemacht

    VB.NET-Quellcode

    1. For Each PD As clsPD In ListePD ' List Of clsPD
    2. Dim nLV As ListViewItem = Me.lv.Items.Add(PD.Datum.ToString("ddd."), 0)
    3. nLV.Tag = PD
    4. nLV.SubItems.Add("")
    5. Next

    Das funktioniert auch gut, allerdings mit den typischen Listview-Problemchen wie Flackern etc. trotz BeginUpdate/EndUpdate kriegt man das ja nie so richtig weg - mit den standardwerkzeugen m.w.

    ich wähle aus der liste ein element aus, hole mir via directcast das PD-element und zeige die daten in einer eingabemaske an.
    ich möchte nun aber von dem dämlichen verhalten, daten eingeben, button drücken zum speichern, liste neu laden weg.
    d.h. ich möchte die daten eingeben/ändern, das listview soll sich entsprechend danach updaten.
    dazu habe ich im leave-ereigniss der textboxen zwar schon code drin um PD selbst entsprechend zu manipulieren, allerdings nicht um das listview zu aktualisieren.
    das reine neuladen der liste nach obigen code führt u.a. dazu das mein selektiertes listviewitem ja auch weg ist.
    kann man zwar zwischenspeichern und neu setzen, dann aber mit dem haken, das dann ja auch die daten neu geladen werden und der cursor aus den textboxen verschwindet, da ich ja bei selcteditem-change auf ein bestimmtes textfeld springe.

    gleichzeitig wird aber u.u. das datum des eintrages geändert, dann soll der eintrag auch entsprechend "wandern" - sortierung habe ich und geht auch. allerdings halt nur beim komplett befüllen derzeit. das dürfte mein persönlicher knackpunkt sein. alle anderen änderungen ließen sich ja via selecteditem durchaus direkt updaten.

    nun zur frage, wie macht man das am gescheitesten?

    - dateneingabe
    - on the fly listview updaten

    grüße
    fly
    Morgen @FlyingEagle
    Das was du vorhast kling sehr nach Datenverarbeitung.
    Am besten nutzt du dazu DataBinding. Dann wird das alles automatisch erledigt. Funktioniert sehr gut.
    Hier im Forum gibt es sogar extra für ListView ein Tutorial.
    Vorteil ist einmal die einfache Verarbeitung und Aktualisierung und außerdem spart man sich den ganzen Kram zum Verwalten. (z.B Elemente manuell einfügen und auslesen)
    Hier ist eine Demo dazu. codeproject.com/Articles/10008/Data-binding-a-ListView

    Bzgl. des Flackerns kannst du mal Me.DoubleBuffered = True probieren.

    FlyingEagle schrieb:

    wie macht man das am gescheitesten?
    Schmeiß das ListView raus, nimm ein DataDridView.
    Nimm eine typisierte DataTable, gib ihr die entsprechenden Spalten, befülle sie und binde sie an die DataSource-Property des DataGridView. Gugst Du z.B. hier.
    Feddich.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    FlyingEagle schrieb:

    das datagridview.
    Gib mal datagridview hier in der Forumssuche ein und sieh Dir an, was da alles so steht.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    VB.NET-Quellcode: Class SmoothListView.vb

    1. Imports System.ComponentModel
    2. Public Class SmoothListView
    3. Inherits System.Windows.Forms.ListView
    4. Public Sub New()
    5. MyBase.SetStyle(ControlStyles.OptimizedDoubleBuffer, True)
    6. End Sub
    7. <Browsable(False)>
    8. Protected Overrides Property DoubleBuffered As Boolean
    9. Get
    10. Return MyBase.DoubleBuffered
    11. End Get
    12. Set(value As Boolean)
    13. MyBase.DoubleBuffered = True
    14. End Set
    15. End Property
    16. ' That's all :D
    17. End Class