2008-09-06 14 views
3

Ich möchte einige andere Steuerelemente basierend auf der Anzahl der Elemente in meinem Steuerelement ListView aktivieren/deaktivieren. Ich kann kein Ereignis finden, das dies tun würde, entweder auf der ListView selbst oder auf der ListViewItemCollection. Vielleicht gibt es eine Möglichkeit, jede Sammlung in C# generisch auf Änderungen zu überwachen?Gibt es ein Ereignis, das ausgelöst wird, wenn sich die Anzahl der ListViewItems in einer ListView ändert? (Windows Forms)

ich auch mit anderen Ereignissen glücklich sein würde, auch solche, die manchmal ausgelöst, wenn die Elemente nicht ändern, sondern zum Beispiel der ControlAdded und Layout Ereignisse haben nicht funktioniert :(.

Antwort

2

@Domenic

Nicht zu sicher, nie so weit in den Gedankengang.

Eine andere Lösung könnte sein, ListView zu erweitern, und beim Hinzufügen und Entfernen von Zeug, anstatt .items.add und items.remove aufzurufen, rufen Sie Ihre anderen Funktionen auf. Es wäre immer noch möglich, Ereignisse hinzuzufügen und zu entfernen, ohne dass Ereignisse ausgelöst werden, aber mit einem kleinen Code-Review, um sicherzustellen, dass .items.add und .items.remove nicht direkt aufgerufen werden, könnte es ganz gut funktionieren. Hier ist ein kleines Beispiel. Ich habe nur 1 Add-Funktion gezeigt, aber es gibt 6, die Sie implementieren müssten, wenn Sie alle verfügbaren Add-Funktionen nutzen möchten. Es gibt auch .AddRange und .Clear, die Sie vielleicht ansehen möchten.

Public Class MonitoredListView 
    Inherits ListView 

    Public Event ItemAdded() 
    Public Event ItemRemoved() 

    Public Sub New() 
     MyBase.New() 
    End Sub 

    Public Function AddItem(ByVal Text As String) As ListViewItem 
     RaiseEvent ItemAdded() 

     MyBase.Items.Add(Text) 
    End Function 

    Public Sub RemoveItem(ByVal Item As ListViewItem) 
     RaiseEvent ItemRemoved() 

     MyBase.Items.Remove(Item) 
    End Sub 

End Class 
+0

Ich würde denken, es wäre besser, das Ereignis _after_ die Änderung statt zuvor zu erhöhen. Oder Sie könnten zwei Ereignisse haben. 'RaiseEvent ItemAdding();' for before und 'RaiseEvent ItemAdded();' for after. –

0

kann ich nicht finden alle Ereignisse, die Sie nutzen könnten. Vielleicht könnten Sie ListViewItemCollection Unterklasse, und Ihre eigene Veranstaltung zu erhöhen, wenn etwas hinzugefügt wird, mit Code ähnlich, dies zu.

Public Class MyListViewItemCollection 
    Inherits ListView.ListViewItemCollection 

    Public Event ItemAdded(ByVal Item As ListViewItem) 

    Sub New(ByVal owner As ListView) 
     MyBase.New(owner) 
    End Sub 

    Public Overrides Function Add(ByVal value As System.Windows.Forms.ListViewItem) As System.Windows.Forms.ListViewItem 
     Dim Item As ListViewItem 

     Item = MyBase.Add(value) 

     RaiseEvent ItemAdded(Item) 

     Return Item 
    End Function 
End Class 
0

ich denke, das beste, was Sie hier tun können, ist eine Unterklasse ListView und stellen Sie die gewünschten Ereignisse zur Verfügung