Vb.net 在构造函数期间/之后限定类属性(子新建)

Vb.net 在构造函数期间/之后限定类属性(子新建),vb.net,Vb.net,我正在寻找一种在New()sub期间或之后获取属性值的方法。一般来说,我想知道是否有一种方法可以在类的所有属性都完全启动后自动调用某些代码 在Sub New()期间,属性将设置为其初始值,而不是设计时设置的值 本质上,我想知道除了类之外,是否有可能设置类似于“Form Showed”事件的内容 代码: 注意:在“设计”视图中,“Max”属性的值设置为3。我能看到的唯一回答您问题的方法是在类中设置自定义事件,并在构造函数末尾激发它。使用构造函数的问题是,设计器代码在创建对象之后很好地设置了属性。但

我正在寻找一种在New()sub期间或之后获取属性值的方法。一般来说,我想知道是否有一种方法可以在类的所有属性都完全启动后自动调用某些代码

在Sub New()期间,属性将设置为其初始值,而不是设计时设置的值

本质上,我想知道除了类之外,是否有可能设置类似于“Form Showed”事件的内容

代码:


注意:在“设计”视图中,“Max”属性的值设置为3。

我能看到的唯一回答您问题的方法是在类中设置自定义事件,并在构造函数末尾激发它。

使用构造函数的问题是,设计器代码在创建对象之后很好地设置了属性。但是,NET框架包括接口
ISupportInitialize
,它非常适合于需要有条件地限定属性等操作的控件和组件,例如在设置
Min
Max
后检查
Value

它易于使用:

Imports System.ComponentModel

Public Class Test
    Inherits Component
    Implements ISupportInitialize
在最后一行按enter键时,将添加两种方法:

Public Sub BeginInit() Implements ISupportInitialize.BeginInit

Public Sub EndInit() Implements ISupportInitialize.EndInit
这允许您执行以下操作:

Public Sub New()
    MyBase.New()
End Sub

Public Sub EndInit() Implements ISupportInitialize.EndInit
    ' do whatever you want to do
    ' all properties will be initialized at this time
    ' e.g. Max will be the IDE value, not 5
    ...
End Sub
它的工作方式是VS将在控件/组件属性之后从设计器代码中调用它。如果打开设计器代码,您将看到如下内容:

 ' ctl declarations
 CType(Me.Test1, System.ComponentModel.ISupportInitialize).BeginInit()

 ' lots of code initializing controls
 Me.Label1.Name = "Label1"
 ...
 Me.Button1.Location = ...
 ...
 Me.Test1.Max = 3         ' yours will be there somewhere

 ' then at the end:
 CType(Me.Test1, System.ComponentModel.ISupportInitialize).EndInit()
因此,您可以添加在
BeginInit
方法中创建任何内容之前需要运行的任何代码,以及在
EndInit
中初始化所有属性之后需要运行的代码


BeginInit
EndInit
将在每次运行设计器代码时运行。也就是说,每次在运行时以及对表单进行足够的更改后,都需要重新构建表单。您确实需要保持组件代码的新鲜,因为VS在IDE中使用它的编译版本来处理使用它的项目


所以,经常重建和清理,当它似乎没有收到更改时。

好建议,我刚刚尝试过。不幸的是,在初始化属性之前仍然引发了事件…您所说的在初始化属性之前是什么意思?如果不在构造函数中,它们什么时候初始化?你能展示你的代码吗?我的意思是在我的第二段,这个属性仍然保持它的初始值。我将更新帖子以包含一些伪代码。谢谢。这是UserControl类吗?如果您只有一个属性,那么您可以尝试在属性的Set子句中触发一个事件。否则,我想您可以尝试找出最后一个设置并在这个设置中触发事件,或者为每个属性触发一个事件并分别处理它们。这应该在设计模式和可执行文件本身中工作,对吗?由于某种原因,我在那里设置的代码没有显示程序运行的前几次。奇怪的是,在再次重建之后,它似乎起了作用。我想知道这是怎么回事,因为我在重建后没有改变任何与之相关的东西。。。?无论如何,非常感谢你!它将在每次运行时以及刷新/重建设计器代码时运行(例如打开承载组件的窗体设计器);您可以向EndInit添加
Console.Beep
,以获得感觉。如果您对组件进行更改,您将需要重建甚至经常清理,以确保VS使用正确的代码。@还有一个基于事件的版本,名为
ISupportInitializeNotification
-请注意,任何一个都可以“滴流”事件或通知子对象来初始化内容,我真的很感谢你的详细解释。是的,那可能就是当时的情况,只是需要清理/重建。我总是忘记那件事。我需要深入研究“Implements”语句。
 ' ctl declarations
 CType(Me.Test1, System.ComponentModel.ISupportInitialize).BeginInit()

 ' lots of code initializing controls
 Me.Label1.Name = "Label1"
 ...
 Me.Button1.Location = ...
 ...
 Me.Test1.Max = 3         ' yours will be there somewhere

 ' then at the end:
 CType(Me.Test1, System.ComponentModel.ISupportInitialize).EndInit()