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

时间:2018-12-04 08:25:25

标签: .net vb.net

我正在处理从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中?

谢谢。

1 个答案:

答案 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