ListView Ausgewähltes Item

  • VB.NET
  • .NET (FX) 4.0

Es gibt 24 Antworten in diesem Thema. Der letzte Beitrag () ist von ~blaze~.

    Ich habe ja bei mir im Projekt Callback-Funktionen, das sind ja quasi Delegaten. Eine sehr feine Sache, vor allem, weil die erste Callback nur dazu da ist, in den GUI-Thread zu gehen und von da aus die eigentliche Callback-Funktion aufzurufen :thumbup:
    Folgendes verwirrte mich:

    ~blaze~ schrieb:

    Du kannst eine Klasse von ListViewItem erben lassen, diese dann im Code hinzufügen. Gibst du der Klasse bspw. einen Delegaten bei der Instantiierung mit, so kannst du ihn in einer Property zwischenspeichern und über einen Cast später ausführen - oder du machst ähnliches mit einer Beschreibung, was ausgeführt werden soll.


    Und die Beiträge die auf diesen Beitrag aufbauten!
    Füge deinem Projekt eine neue Klasse hinzu, die von ListViewItem erbt:

    Visual Basic-Quellcode

    1. Public Class MyListViewItem
    2. Inherits ListViewItem
    3. End Class

    Das heißt: Der Typ MyListViewItem erbt vom Typ ListViewItem und kann quasi dessen Funktionalität erweitern. Daher kannst du jetzt einfach neue Properties definieren, wie z.B. einen Delegaten. Der Delegat würde dann die Aktion ausführen, die dem ListViewItem zugeordnet werden soll, wenn es aktiviert wird. So könnte man bspw. einen Delegaten hinzufügen, der eine MessageBox anzeigt, die angibt, welches Element aufgerufen wird.
    Sinnvollerweise, da der Delegat nicht geändert werden wird, kannst du die Eigenschaft wie folgt anlegen:

    Visual Basic-Quellcode

    1. Public Class MyListViewItem
    2. Inherits ListViewItem
    3. Private _action As Action
    4. Public Property Action As Action
    5. Get
    6. Return _action
    7. End Get
    8. Private Set(value As Action)
    9. _action = value
    10. End Set
    11. Public Sub New(text As String, action As Action)
    12. 'wenn dich interessiert, was hier passiert, siehe Anmerkung
    13. MyBase.New(text)
    14. If action Is Nothing Then Throw New ArgumentNullException("action")
    15. Me.Action = action
    16. End Sub
    17. End Class

    New ist hierbei der Konstruktor der Klasse, der aufgerufen wird, wenn du eine Instanz des Typs erzeugst, z.B. so:

    Visual Basic-Quellcode

    1. Dim newItem as New MyListViewItem("Text", Sub() MessageBox.Show("Hallo"))

    Dieses neue Element fügst du dann eben deiner Instanz der ListView-Klasse hinzu, indem du ListViewInstance.Items.Add(newItem) aufrufst.
    Jetzt legst du noch einen Abonnenten des ItemActivate-Events an (hieß glaub ich so):

    Visual Basic-Quellcode

    1. Private Sub ListViewInstance_ItemActivate(sender As Object, e As EventArgs) Handles ListViewInstance.ItemActivate
    2. Dim item As MyListViewItem = TryCast(ListViewInstance.FocusedItem, MyListViewItem) 'Ermittle das MyListViewItem, das den Fokus hat
    3. If item IsNot Nothing Then 'Ist das fokussierte Element wirklich vom Typ MyListViewItem? Wenn nein, ist item Nothing
    4. item.Action.Invoke()
    5. Else
    6. 'Mach was, wenn es kein MyListViewItem ist
    7. End If
    8. End Sub

    Somit wird im Ereignisabonnenten, der ListViewInstance_ItemActivate-Methode, die Aktion ausgelöst, die du oben (siehe newItem) festgelegt hattest.

    Anmerkung:
    Im Konstruktor der MyListViewItem-Klasse sorgen die Codezeilen für folgende Funktionalität:

    Visual Basic-Quellcode

    1. MyBase.New(text)

    Ruft den Konstruktor der Basisklasse (ListViewItem) auf, um ihr den Parameter text weiterzureichen. Damit übernimmt diese eben den Text, der in jenem übergeben wurde. Was müsstest du also tun, damit auch ImageIndex oder sonstige, benötigte Informationen festgelegt werden könnten?

    Visual Basic-Quellcode

    1. If action Is Nothing Then Throw New ArgumentNullException("action")

    überprüft, ob action ein Wert zugewiesen wurde, weil Nothing nicht zulässig ist. Folglich wird eine Ausnahme geworfen, wenn der Wert Nothing ist, um möglichst frühzeitig abzufangen, ob eine gültige Aktion vorhanden ist. Die ArgumentNullException-Klasse ist eben genau für diesen Zweck zu verwenden: Sie soll geworfen werden, wenn ein übergebenes Argument Nothing ist, das nicht Nothing sein darf.

    Visual Basic-Quellcode

    1. Me.Action = action

    weist eben dann noch der Eigenschaft Action ihren Anfangswert zu. Da die Eigenschaft nach außen hin geschützt ist (Der Setter ist ja wegen dem Private-Modifikator privat!), kann der Wert der Eigenschaft für das Item - zumindest von außen - nicht auf einen neuen Wert festgelegt werden.


    Gruß
    ~blaze~

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