How to detect if items are added to a ListBox (or CheckedListBox) control

前端 未结 4 1485
佛祖请我去吃肉
佛祖请我去吃肉 2020-12-09 16:38

This seems like a fundamentally simple question. I have a WinForms dialog box with a listbox. This control is not populated via data-binding but is filled with call

相关标签:
4条回答
  • 2020-12-09 16:59

    This solution seems to work - in my situation, I implemented it in VB. I just created an ExtendedListbox class which inherits the listbox control, implements INotifyPropertyChanged and shadows the Items Property.

    Imports System.ComponentModel
    
    Public Class ExtendedListBox:Inherits ListBox:Implements INotifyPropertyChanged
    
        Public Shadows Property Items() As ObjectCollection
            Get
                RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs("Items"))
                Return MyBase.Items
            End Get
            Set(value As ObjectCollection)
                RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs("Items"))
                MyBase.Items.Clear()
                For Each o As Object In value
                    MyBase.Items.Add(o)
                Next
            End Set
        End Property
    
        Public Event PropertyChanged(sender As Object, e As PropertyChangedEventArgs) Implements INotifyPropertyChanged.PropertyChanged
    End Class
    
    0 讨论(0)
  • 2020-12-09 17:03

    I don't know of any event that you can watch to show that an item has been added to a ListBox. Perhaps you can use the Win32 method you described instead (i.e. grab a handle, use WndProc, etc.).

    Alternately, perhaps you can use another class that adds items instead. For example, rather than calling the Add method on the ListBox directly, you could have user-actions call the Add method inside the new class which then adds the item to the ListBox. You could set an event inside that class that would allow you to watch what's been added.

    I also like the idea of subclassing the ListBox as mentioned by another poster....

    0 讨论(0)
  • 2020-12-09 17:03

    Here's a post on another forum that recommends creating a child class that includes that behaviour.

    http://www.eggheadcafe.com/forumarchives/netframeworkcompactframework/jul2005/post23265940.asp

    0 讨论(0)
  • 2020-12-09 17:05

    Unfortunately, there's no easy way to do this using inheritance or events. You should be able to override the Add method of the Items class, but you can't get to it! You may be able to intercept the message loop to figure out when this is happening, but that's beyond my experience.

    One thing I noticed from your question is that you mention items are being added asynchronously. Don't do that. Your problem may be solved if you synchronize on the form's thread (if your problem is that the control isn't updating).

    0 讨论(0)
提交回复
热议问题