我正在处理从VB6转换而来的旧版.NET项目。在VB6中,存在控件数组的概念。转换后,控件数组将转换为Microsoft.VisuaBasic.Compatibility.VB6.xxxArray。
例如,以下代码在Designer.VB中。
Me._label_0 = New System.Windows.Forms.Label()
Me._label_1 = New System.Windows.Forms.Label()
Me.label = New Microsoft.VisualBasic.Compatibility.VB6.LabelArray(Me.components)
Me.label.SetIndex(Me._label_0, CType(0, Short))
Me._label_0.Location = New System.Drawing.Point(29, 20)
Me._label_0.Name = "_label_0"
Me._label_0.Size = New System.Drawing.Size(50, 20)
Me._label_0.TabIndex = 0
Me._label_0.Text = "label0"
Me.label.SetIndex(Me._label_1, CType(1, Short))
Me._label_1.Location = New System.Drawing.Point(29, 53)
Me._label_1.Name = "_label_1"
Me._label_1.Size = New System.Drawing.Size(50, 20)
Me._label_1.TabIndex = 1
Me._label_1.Text = "label1"
Me.Controls.Add(_label_0)
Me.Controls.Add(_label_1)
请注意,有Me.label.SetIndex(Me._label_0, CType(0, Short))
会将_label_0添加到数组的索引0。
SetIndex是自动生成的。也就是说,如果我在表单设计器中进行了任何更改(Designer.vb将被重新生成),那么这段代码仍将保留在designer.vb中。
现在,因为不建议使用Microsoft.VisualBasic.Compatibility.VB6。所以我自己写了一个XXXArray(比如MyLabelArray)。一切正常,除了无法自动生成SetIndex部分。
也就是说,每当我在“表单设计器”中进行任何更改(例如,拖动以更改表单或标签的位置)时,都会重新生成designer.vb,并且所有SetIndex都将被自动删除。
是否有办法将这小段代码保留在designer.vb中?
谢谢。
答案 0 :(得分:1)
感谢您的评论。
答案是实现IExtenderProvider。下面是一个简单的示例(不是VB6中的一个完全功能齐全的objectArray)。
<ProvideProperty("Index", GetType(Label))>
Public Class MyLabelArray
Inherits Components
Implements IExtenderProvider
Dim ctrDic As New Dictionary(Of Integer, Label)()
Public Function CanExtend(extendee As Object) As Boolean Implements IExtenderProvider.CanExtend
Return TypeOf extendee Is Label AndAlso ctrDic.Values.Contains(DirectCast(extendee, Label))
End Function
Public Sub SetIndex(ByVal ctr As Label, ByVal index As Integer)
ctrDic(index) = c
HookEvents(c)
End Sub
Public Function GetIndex(ByVal ctr As Label) As Integer
For Each kvp In ctrDic
If kvp.Value.Equals(ctr) Then
Return kvp.Key
End If
Next
Return -1
End Function
End Class