如何强制将一段代码保存在designer.vb或designer.cs中



我正在处理一个从VB6转换而来的遗留.NET项目。在VB6中,出现了控制数组的概念。转换后,控制数组被转换为Microsoft.VisuaBasic.Compatibility.VB6.xxxxArray.

例如,以下代码位于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中?

谢谢。

感谢您的评论。

答案是实现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

相关内容

最新更新