2014-10-10 1 views
1

Я ищу способ получить значение свойства во время или после подстроки New(). В общем, хотя я хотел бы знать, есть ли способ вызвать некоторый код автоматически после того, как класс имеет все свойства его свойств полностью инициированы.Квалифицировать свойства класса во время/после конструктора (Sub New)

В свойствах Sub New() устанавливаются их начальные значения, а не те, которые установлены во время разработки.

По существу, мне интересно, возможно ли установить что-то похожее на событие «Форма показано», за исключением классов.

Код:

Public Class Test 
inherits Component 

Public Event Initiated() 

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

Private Sub OnInitiated() Handles Me.Initiated 
    Debug.WriteLine(Max) 
End Sub 

Private _Max As Integer = 5 
Public Property Max() As Integer 
    Get 
     Return _Max 
    End Get 
    Set(ByVal Value As Integer) 
     _Max = Value 
    End Set 
End Property 
End Class 

Примечание: Значение свойства "Max" установлен на 3 с точки зрения дизайна.

ответ

1

Проблема с помощью конструктора, что код дизайнер устанавливает ваш свойства после его создания. Но NET Framework включает интерфейс ISupportInitialize, который идеально подходит для элементов управления и компонентов, которые должны выполнять такие вещи, как, например, квалифицировать свойства, например, проверку ValueпослеMin и Max.

Он прост в использовании:

Imports System.ComponentModel 

Public Class Test 
    Inherits Component 
    Implements ISupportInitialize 

При нажатии клавиши ввода на последней строке, это добавит 2 метода:

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 при работе над проектом, используя его.

Итак, перестраивайте часто и очищайте, когда кажется, что он не подбирает изменения.

+0

Предполагается, что это работает в режиме разработки и в самом исполняемом файле правильно? По какой-то причине код, который у меня был установлен, не показывал первые несколько раз, когда программа запускалась. Как ни странно, после его восстановления в другой раз он работает. Интересно, что это такое, поскольку я не изменил ничего связанного с этим после перестройки ...? В любом случае, большое спасибо! –

+0

он будет запускаться каждый раз во время выполнения и когда код разработчика обновляется/перестраивается (например, при открытии конструктора форм, в котором размещается ваш компонент); вы можете добавить 'Console.Beep' в EndInit, чтобы почувствовать. Если вы внесете изменения в компонент, вам захочется перестроить и даже очистить часто, чтобы убедиться, что VS использует правильный код. – Plutonix

+0

@MakoInfused существует также версия на основе событий под названием 'ISupportInitializeNotification' - обратите внимание, что либо можно« просачивать »вниз события, либо уведомления на вспомогательные объекты, чтобы инициализировать материал, а также – Plutonix

0

Единственное, что я мог видеть, чтобы ответить на ваш вопрос, чтобы создать пользовательское событие в своем классе и стрелять в конце конструктора

+0

Хорошее предложение, я просто попробовал это. К сожалению, событие все еще было поднято до того, как свойства были инициализированы ... –

+0

Что вы имеете в виду до того, как свойства были инициализированы? Когда они инициализируются, если нет в конструкторе? Можете ли вы показать свой код? –

+0

То, что я имею в виду в моем втором абзаце, свойство все еще сохраняет его начальное значение.Я обновляю сообщение, чтобы включить некоторый псевдокод. Благодарю. –

Смежные вопросы