簡體   English   中英

檢查列表是否已被修改

[英]Check if list has been modified

我試圖基本上使FlowLayoutPanel只接受我創建的繼承Button的自定義控件。 所以我已經隱藏了Controls屬性並且我創建了自己的屬性,但是我沒有將它聲明為ControlsCollection,而是將其聲明為列表:

Public Shadows ReadOnly Property Controls() As ControlCollection
    Get
        Return MyBase.Controls
    End Get
End Property

Private itms As New List(Of MenuItem)
Public Property Items() As List(Of MenuItem)
    Get
        Return itms
    End Get
    Set(value As List(Of MenuItem))
        itms = value
    End Set
End Property

我所困擾的是如何檢查Items()屬性是否被修改,我可以調用類似的東西:

 Me.Controls.Clear : Me.Controls.AddRange(itms.ToArray())

由於問題是通過公開Items ,可以添加東西,你可以刪除它並公開AddItemRemoveItem類型方法:

Private _dataChanged As Boolean = False
Public Function AddItem(ByVal mi As MenuItem) As Integer
    _items.Add(mi)
    _dataChanged = True
    return _items.Count
End Function

作為List(Of T)它可以防止添加非T項目,但是您的控件並不是完全掌控項目列表,而是以這種方式暴露。 另一種方法可能是使用包含ListChanged事件的BindingList:

Private WithEvents _items As New BindingList(Of MenuItem)
Private _dataChanged As Boolean = False     ' maybe
AddHandler _items.ListChanged, AddressOf _listChanged

Public Property Items() As BindingList(Of MenuItem)
  Get
      Return itms
  End Get
  Set(value As List(Of MenuItem))
      _items = value
  End Set
End Property

'...

private Event _listChanged(ByVal sender As Object, _
          ByVal e As ListChangedEventArgs)
    _dataChanged = True
    RoutineToDoSomethingAboutDataChanged()
End Sub

您可以通過ListChangedEventArgs告知哪個項目已更改,因此您可以根據需要僅對已更改的項目執行某些操作。 Me.Controls.AddRange(itms.ToArray())不會工作,因為BindingList不支持ToArray方法。

還有,將它們移動到ControlCollection是什么意思? 這是序列化嗎?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM