Как удалить себя из своего родителя БЕЗ ошибки в DesignMode - PullRequest
0 голосов
/ 11 марта 2012

Я пытался создать элемент управления, который будет убивать себя при добавлении в форму.На самом деле, я хочу сделать элемент управления, который будет запрашивать пароль перед добавлением в форму, и удалить себя, если пароль неправильный ... Что-нибудь работает отлично, оно действительно удалит себя из родительской формы, но оно покажетсообщение об ошибке тоже: «child» не является дочерним элементом управления этого родителя. »

Здесь код:

Public Class SuicideCustomButton
    Inherits Button

    Protected Overrides Sub InitLayout()
        If DesignMode Then
            Me.Parent.Controls.Remove(Me)
            'ALWAYS SHOW ERROR HERE
        Else
            Me.Parent.Controls.Remove(Me)
            'NO ERROR SHOWED HERE
        End If
    End Sub
End Class

Как мне избавиться от этого сообщения об ошибке?

1 Ответ

1 голос
/ 11 марта 2012

Если вы хотите, вы можете скрыть свой элемент управления от видимости в панели инструментов

<System.ComponentModel.ToolboxItem(False)> _
Public Class SuicideCustomButton
    Inherits Button

    ...

End Class

Обновление:

Это новая версия, это умный материал, который спрашиваетВы хотите ввести пароль в режиме конструктора, и если вы хотите создать экземпляр по коду (без дизайнера), вам следует передать пароль конструктору:

Public Class SuicideCustomButton
    Inherits Button

    Dim KillMeOut As Boolean = False
    Private _Pass As String
    Public Property Pass() As String
        Get
            Return _Pass
        End Get
        Set(ByVal value As String)
            _Pass = value
        End Set
    End Property

    Protected Overrides Sub OnLocationChanged(ByVal e As System.EventArgs)
        MyBase.OnLocationChanged(e)
        '                                                                                                                 In Design mode this is required
        If DesignMode AndAlso KillMeOut AndAlso Me.Parent IsNot Nothing AndAlso Me.Parent.Controls.Contains(Me) Then
            Me.Parent.Controls.Remove(Me)
        End If
    End Sub

    Protected Overrides Sub InitLayout()
        MyBase.InitLayout()
        If Pass <> "xpass" Then

            If Not DesignMode AndAlso Not KillMeOut AndAlso Me.Parent IsNot Nothing AndAlso Me.Parent.Controls.Contains(Me) Then
                Throw New Exception("You can't add this object in without a password :)")
            Else
                If Not PassInputFrm.Pass Then
                    KillMeOut = True
                Else
                    Pass = "xpass"
                End If
            End If

        End If

    End Sub

    ''' <summary>
    ''' This will be used in design mode
    ''' </summary>
    Public Sub New()

    End Sub

    ''' <summary>
    ''' Use this constructor in code mode
    ''' </summary>
    Public Sub New(ByVal pass As String)
        If Not PassInputFrm.ValidatePass(pass) Then
            KillMeOut = True
        Else
            pass = "xpass"
        End If
    End Sub

End Class

Вам понадобится форма для ввода пароля, поэтому я ее создаю.и загрузите его здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...