Есть ли свойство определять, загружена ли форма (и ее элементы управления)?

Я хотел бы уточнить, что я уже знаю, как проверить, загружена ли форма, установив флаг логической переменной (пример: dim FormIsLoaded as boolean) и установив для него значение True после события Load формы, чтобы ограничить использование метода [Enum].Parse, который вызывает исключение в моем коде.

Но это не то, о чем я прошу, это не типичный вопрос, пожалуйста, продолжайте читать...


У меня есть такой обработчик событий:

''' <summary>
''' Indicates the resulting Batch command redirection.
''' </summary>
Private CommandRedirection As Reg2Bat.CommandRedirection = 
        Reg2Bat.CommandRedirection.Standard

Private Sub KryptonRadioButton_CommandRedirections_CheckedChanged(sender As Object, e As EventArgs) Handles _
        KryptonRadioButton_CommandRedirection_Standard.CheckedChanged,
        KryptonRadioButton_CommandRedirection_Error.CheckedChanged,
        KryptonRadioButton_CommandRedirection_All.CheckedChanged,
        KryptonRadioButton_CommandRedirection_None.CheckedChanged

    If CBool(sender.checked) Then
        CommandRedirection = [Enum].Parse(GetType(CMD.CommandRedirection), 
                                          CStr(sender.tag), True)
    End If

End Sub

Но If дает мне ошибку типа An unhandled exception of type 'System.InvalidOperationException' occurred in Program.exe, и я уверен, что ошибка возникает из-за того, что форма не полностью загружена до того, как обработчик событий попытается получить доступ к значению элемента управления.

Трассировки стека:

en System.Enum.TryParseEnum(Type enumType, String value, Boolean ignoreCase, EnumResult& parseResult) 
en System.Enum.Parse(Type enumType, String value, Boolean ignoreCase)    
en Reg2Bat.GUI.KryptonRadioButton_CommandRedirection_Standard_CheckedChanged(Object sender, EventArgs e) 
en C:\Users\Administrador\Desktop\Reg2Bat\Reg2Bat\UserInterfaces\GUI\GUI.vb:línea 271  
en ComponentFactory.Krypton.Toolkit.KryptonRadioButton.set_Checked(Booleanvalue) 
en Reg2Bat.GUI.InitializeComponent() 
en C:\Users\Administrador\Desktop\Reg2Bat\Reg2Bat\UserInterfaces\GUI\GUI.Designer.vb:línea 104    
en Reg2Bat.GUI..ctor() 
en C:\Users\Administrador\Desktop\Reg2Bat\Reg2Bat\User Interfaces\GUI\GUI.vb:línea 49

Я хотел бы улучшить "FormIsLoaded?" проверка без написания ненужных переменных (булевых флагов), чтобы мой код был более красивым и упрощенным, поэтому, как следует из названия моего вопроса, я прошу, если существует свойство или просто In-One-Line решение для проверки того, полностью ли загружена форма в любой момент.

Я также прошу об этом, чтобы узнать больше улучшенных альтернатив, чем установка логического значения для проверки загрузки формы.

К тому моменту, когда я пробую свойство (Me.IsAccessible), и кажется, что оно работает правильно, потому что теперь метод [Enum].Parse не выдает никаких исключений, но я не уверен, что на самом деле проверяет свойство (я прочитал IntelliSense помощи реквизита, но ничего).

Private Sub KryptonRadioButton_CommandRedirections_CheckedChanged(sender As Object, e As EventArgs) Handles _
        KryptonRadioButton_CommandRedirection_Standard.CheckedChanged,
        KryptonRadioButton_CommandRedirection_Error.CheckedChanged,
        KryptonRadioButton_CommandRedirection_All.CheckedChanged,
        KryptonRadioButton_CommandRedirection_None.CheckedChanged

    If Me.IsAccessible Then

        If CBool(sender.checked) Then
            CommandRedirection = [Enum].Parse(GetType(Reg2Bat.CommandRedirection),
                                              CStr(sender.tag), True)
        End If

    End If

    MsgBox(CommandRedirection.ToString)

End Sub

Итак, использование свойства Me.IsAccessible является правильным решением для проверки загрузки формы/элементов управления? Если нет, то есть свойство, которое могло бы это проверить?


person ElektroStudios    schedule 06.03.2014    source источник


Ответы (2)


Я считаю, что вы ищете Form.IsHandleCreated, чтобы подтвердить, что он построен (и прошел процедуру InitialiseComponent() в файле .Designer).

После этого стоит проверить Form.IsDisposed, чтобы убедиться, что с тех пор он не был уничтожен.

Это сложнее в многопоточных приложениях, потому что, если вы не можете выполнить проверку в потоке, владеющем формой, его состояние может измениться после выполнения теста.

person J Collins    schedule 06.03.2014

Это тоже отлично работает для меня:

Dim frmShown As Boolean = False
Private Sub MemberList_Shown(sender As Object, e As System.EventArgs) Handles Me.Shown
    frmShown = True
End Sub

Это гарантирует, что все элементы управления были отображены. Затем вы проверяете «frmShown»

person Hannington Mambo    schedule 23.02.2019