Mehrere Listview auf einem Formular

  • VB.NET

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von hal2000.

    Mehrere Listview auf einem Formular

    moin moin,

    also ich bin ein alter VB6-Programmierer und versuche mich seit Anfang April mit VB200 Express.
    Jetzt versuche ich mein VB6-Programm mit VB2008 Express neu zu schreiben.

    Nun zur Frage: Auf meinem VB6-Formular habe ich 8 ListView, die indieziert sind, also Listview1(Index). Die Routine zu Drag & Drop begann dementsprechend mit

    Private Sub ListView1_OLEDragDrop(index As Integer, data As MSComctlLib.DataObject, Effect As Long, Button As Integer, Shift As Integer, X As Single, Y As Single)


    Gibt es unter VB2008 Express eine ähnliche Möglichkeit, mit einem Index zu arbeiten oder muß ich für die 8 ListView tatsächlich 8 mal die gleichen Routinen schreiben/einfügen, um von jedem ListView in jedes ListView verschieben/kopieren zu können?

    Für aussagekräftige Antworten danke ich bereits jetzt :)
    Hi.

    Nein, du musst keine 8 Routinen schreiben. Alle Windows Forms-Ereignishandler haben die Signatur (sender As Object, e As [EventArgs oder eine Kindklasse davon]) Handles Ereignis(se). Und das war eigentlich schon die Antwort: Ein Handler kann mehrere Ereignisse behandeln, sofern die Methodensignatur passt. Da du acht mal dasselbe Ereignis nur von verschiedenen Steuerelementen behandeln willst, ist das kein Problem. Hänge an die Handler-Sub einfach mehrere Ereignisse, jeweils mit Komma getrennt, z.B:

    VB.NET-Quellcode

    1. Private Sub ListViewX_DragDrop(sender As Object, e As irgendwasEventArgs) Handles ListView1.DragDrop, ListView2.DragDrop, etc.

    Du musst jetzt in der Sub nur noch zwischen den einzelnen ListViews unterscheiden, indem du die sender-Variable in ein ListView-Objekt castest und per Select Case ermittelst, welches ListView das Ereignis nun ausgelöst hat.

    EDIT: Die Daten werden nicht mehr als Parameter übergeben, sonder finden sich als Eigenschaft von e, die du mit GetDataPresent() nach dem Typ filtern und mit GetData() auslesen kannst.
    Gruß
    hal2000
    Danke für die ausführliche Antwort.

    Die Sache mit dem "casten", also "veröffentlichen" habe ich so verstanden:

    Private Sub lvwPlanning2_MouseClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles lvwPlanning2.MouseClick
    Dim lv As ListView = CType(sender, ListView)
    ListenIndex = 2
    Label1.Text = "Liste" & ListenIndex & ", Zeile " & lv.FocusedItem.Index
    End Sub

    Werde die nächsten Tage das Drag & Drop ausprobieren.

    Codeoptimierung für mehrere ListView's

    So, habe alles soweit, dass es funktioniert :P . Geht das Einfügen der Daten in das neue ListView besser als so: ?(

    VB.NET-Quellcode

    1. Dim items() As ListViewItem = e.Data.GetData("ListViewItemData")
    2. For i As Integer = 0 To items.Length - 1
    3. 'ziel.Items.Add(items(i).Text)
    4. ziel.Items.Add(New ListViewItem(New String() _
    5. {items(i).Text, items(i).SubItems(1).Text, items(i).SubItems(2).Text, _
    6. items(i).SubItems(3).Text, items(i).SubItems(4).Text, items(i).SubItems(5).Text, _
    7. items(i).SubItems(6).Text, items(i).SubItems(7).Text, items(i).SubItems(8).Text}))
    8. Next


    Wenn ich die auskommentierte Anweisung "ziel.Items.Add(items(i).Text" benutze, habe ich nur die Textspalte und alle SubItems fehlen.

    Gruß
    Hi,

    für das Hinzufügen von mehreren ListViewItems auf einen Schlag gibts die Methode AddRange(). Damit kannst du dein ListViewItem-Array direkt übergeben:

    VB.NET-Quellcode

    1. Dim items() As ListViewItem = e.Data.GetData("ListViewItemData")
    2. ziel.Items.AddRange(items)


    Die AddRange-Methode kommt von der Schnittstelle IList(Of T) und wird von allen Collections zur Verfügung gestellt, die diese Schnittstelle implementieren, also auch von der ListViewItemCollection. Ich weiß nicht wie weit dein Umstieg auf .NET fortgeschritten ist - Collecions, Schnittstellen und Vererbung gabs ja in VB6 noch nicht wirklich, nur wenn das Ganze über COM extern realisiert wurde - jedenfalls ist es meiner Meinung nach ein Schritt in die richtige Richtung. Wenn du weitere Probleme / Fragen hast, kannst du dich gerne an mich (auch per PN) wenden.
    Gruß
    hal2000

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „hal2000“ ()