gpt4 book ai didi

vb.net - 检查列表是否被修改

转载 作者:行者123 更新时间:2023-12-02 07:15:38 26 4
gpt4 key购买 nike

我试图基本上使 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 有何意义?是为了连载吗?

关于vb.net - 检查列表是否被修改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20296629/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com