none
Jeweils 2 Listviews 'gleichschalten'

    Frage

  • Tag, ich habe 4 Listviews in der Anwendung, jede  auf einem tab.

    auf einem anderen tab möchte ich die 4 alle anzeigen, um Einträge untereinander auszutauschen. (Ich möchte nicht einfach die parent-eigenschaft ändern, da ich dann mit meiner resize-Routine probleme bekomme)

    Was macht man da am geschicktesten. Kann man einfach lvwA=lvwB setzen? Oder welcher Ansatz wäre hier einfach zu machen?

    Vielen Dank

    TH

    Samstag, 12. Oktober 2013 10:31

Antworten

  • Also folgende Zeilen kopieren alle Items von ListView1 in ListView2:

            For Each item As ListViewItem In ListView1.Items'Durchlaufe alle Items'
                ListView2.Items.Add(CType(item.Clone(), ListViewItem)) 'Kopiert ein Item'
            Next

    Man muss Clone aufrufen, da ein Item in nur einer ListView vorkommen kann. Wenn du das erste nun veränderst, so bleibt das 2. Unverändert.

    Zum verschieben ginge es so:

            While ListView1.Items.Count > 0 'Laufe solange es Items gibt'
                Dim item As ListViewItem = ListView1.Items(0) 'Item-Verweis "speichern"'
                ListView1.Items.RemoveAt(0) 'Item aus LV 1 entfernen'
                ListView2.Items.Add(item) 'Item in LV2 einfügen'
            End While

    Beim zurück verschieben läuft es genauso ab. Hier hast du den Vorteil, das du jedes Item nur einmal hast.


    Koopakiller [kuːpakɪllɐ] (Tom Lambert)
    Webseite | Code Beispiele | Facebook | Twitter | Snippets   C# ↔ VB.NET Konverter
    Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke.


    Samstag, 12. Oktober 2013 18:44

Alle Antworten

  • Hallo,
    die einzige Idee, die mir dazu einfällt ist, jeweils noch eine 2. ListView zu erstellen. Durch das einfache zuweisen von A = B würde sich nicht ändern, da es sich trotzdem noch um die selbe Instanz handelt. D.h. veränderst du A, dann verändert sich B mit. Die gesamten ListViews beim anzeigen des 5. Tabs zu kopieren halte ich auch für unnötig Leistungsfressend.

    Wenn du je beide ListViews an eine Auflistung gebunden hast, dann könntest du auch 2 erstellen die die selbe Source verwenden. ListViews sind in WinForms aber etwas eingeschränkt (Lösung!?). DataGridViews dagegen können so etwas problemlos.

    Vielleicht wäre aber ein System, wie Visual Studio es nutzt viel besser geeignet? Du erstellst 4 "Minifenster", welche sich als Tabs aber auch nebeneinander usw. anordnen lassen.


    Koopakiller [kuːpakɪllɐ] (Tom Lambert)
    Webseite | Code Beispiele | Facebook | Twitter | Snippets   C# ↔ VB.NET Konverter
    Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke.

    Samstag, 12. Oktober 2013 11:46
  • Hallo,
    die einzige Idee, die mir dazu einfällt ist, jeweils noch eine 2. ListView zu erstellen. Durch das einfache zuweisen von A = B würde sich nicht ändern, da es sich trotzdem noch um die selbe Instanz handelt. D.h. veränderst du A, dann verändert sich B mit.


    Also, ich komm nicht klar:

    Dim li As ListViewItem, ii As Integer With lvwPlaylist For ii = 1 To 10 li = .Items.Add("Item " & ii) li.SubItems.Add("Subitem " & ii) Next ii End With

    LvwExplore = lvwPlaylist

    Da bleibt LvwExplore völlig leer. Auch wenn ich die Zuweisung vor die Schleife setze tut sich nix.

    und das:

    With lvwPlaylist
             For ii = 1 To 10
                li = .Items.Add("Item " & ii)
                li.SubItems.Add("Subitem " & ii)
             Next ii
          End With
          LvwExplore.Items.AddRange(lvwPlaylist.Items)

    macht in der Letzten Zeile eine Fehlermeldung
    'Das Element Item 1 kann nur an einer Stelle hinzugefügt oder eingefügt werden. Entfernen Sie es von der aktuellen Position, oder klonen Sie es.'

    Es wäre mir schon eine Hilfe, wenn die items in einem Rutsch von Lvw1 nach Lvw2 kopiert werden könnten. Gelingt mir aber nicht.

    Gruß

    TH

    Samstag, 12. Oktober 2013 18:13
  • Also folgende Zeilen kopieren alle Items von ListView1 in ListView2:

            For Each item As ListViewItem In ListView1.Items'Durchlaufe alle Items'
                ListView2.Items.Add(CType(item.Clone(), ListViewItem)) 'Kopiert ein Item'
            Next

    Man muss Clone aufrufen, da ein Item in nur einer ListView vorkommen kann. Wenn du das erste nun veränderst, so bleibt das 2. Unverändert.

    Zum verschieben ginge es so:

            While ListView1.Items.Count > 0 'Laufe solange es Items gibt'
                Dim item As ListViewItem = ListView1.Items(0) 'Item-Verweis "speichern"'
                ListView1.Items.RemoveAt(0) 'Item aus LV 1 entfernen'
                ListView2.Items.Add(item) 'Item in LV2 einfügen'
            End While

    Beim zurück verschieben läuft es genauso ab. Hier hast du den Vorteil, das du jedes Item nur einmal hast.


    Koopakiller [kuːpakɪllɐ] (Tom Lambert)
    Webseite | Code Beispiele | Facebook | Twitter | Snippets   C# ↔ VB.NET Konverter
    Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke.


    Samstag, 12. Oktober 2013 18:44
  • Vielen Dank!

    TH

    Samstag, 12. Oktober 2013 22:09