コントロール内のアイテムの数に基づいて、他のいくつかのコントロールを有効/無効にしたいのですがListView
。ListView
それ自体またはで、これを行うイベントが見つかりませんListViewItemCollection
。たぶん、変更がないかC#のコレクションを一般的に監視する方法はありますか?
他のイベントにも満足しています。アイテムが変更されないときに発生することもありますが、たとえば、ControlAdded
andLayout
イベントは機能しませんでした:(。
@Domenic
よくわかりませんが、思考プロセスでこれほどまでに進んだことはありません。
別の解決策は、ListViewを拡張することであり、ものを追加および削除するときに、.items.addおよびitems.removeを呼び出す代わりに、他の関数を呼び出します。イベントを発生させずに追加および削除することは可能ですが、.items.addおよび.items.removeが直接呼び出されていないことを確認するためのコードレビューを少し行うだけで、非常にうまく機能する可能性があります。ここに小さな例があります。1つの追加機能のみを示しましたが、使用可能なすべての追加機能を使用したい場合は、6つ実装する必要があります。.AddRangeと.Clearもありますので、ご覧ください。
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
使用できるイベントが見つかりません。おそらく、ListViewItemCollectionをサブクラス化し、これに似たコードを使用して、何かが追加されたときに独自のイベントを発生させることができます。
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
ここでできる最善のことは、ListViewをサブクラス化し、必要なイベントを提供することだと思います。