Pergunta

Eu tenho um botão 'Aplicar' em um formulário que inicialmente possui a propriedade Enabled = False, mas quando um controle dentro de qualquer GroupBox no de é alterado Enabled = True deve ser definido.

Eu tenho vários controles GroupBox no formulário e esperava poder simplesmente verificar se um controle em algum deles foi alterado.No entanto, embora pareça que você pode se conectar ao ControlAdded e ControlRemoved eventos, não há ControlChanged evento.

Atualmente estou configurando isso conforme abaixo (há muito mais de 5 controles para verificar na realidade).

Existe uma maneira mais eficiente de fazer isso, já que posso ver que isso causará problemas no futuro (se opções forem adicionadas a um grupo, por exemplo)?Obrigado.

Private Sub ControlChanged(sender As Object,
                           e As EventArgs) Handles txtUsername.KeyUp,
                                                   chkRestoreIEFavourites.CheckedChanged,
                                                   chkRestoreNicknames.CheckedChanged,
                                                   chkRestoreDesktop.CheckedChanged,
                                                   chkRestoreQuickLaunch.CheckedChanged
    Me.btnApply.Enabled = True
End Sub
Foi útil?

Solução

Infelizmente, descobri uma maneira de fazer isso ...

O abaixo agora adiciona manipuladores (em Shown) para que se houver CheckBox ou TextBox dentro de um GroupBox no formulário for alterado, o Apply botão está definido para Enabled = True.Eu também removo as alças quando o de é Closing.

Se esta é a melhor maneira de fazer isso, não sei, mas por enquanto é a única maneira que conheço.Comentários são bem-vindos!

Private Sub formSettings_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    SetupChangeHandlers()
End Sub

Private Sub formSettings_Closing(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Closing
    SetupChangeHandlers(Remove:=True)
End Sub

Private Sub SetupChangeHandlers(Optional ByVal Remove As Boolean = False)

    For Each GroupBox As GroupBox In Me.sptSettings.Panel2.Controls.OfType(Of GroupBox)() _
                                       .OrderBy(Function(b) b.TabIndex)
        For Each Control As Control In GroupBox.Controls.OfType(Of Control)() _
                                       .OrderBy(Function(b) b.TabIndex)

            If TypeOf Control Is CheckBox Then
                Dim Checkbox = CType(Control, CheckBox)
                If Not Remove Then : AddHandler Checkbox.CheckedChanged, AddressOf GroupBoxControl_Changed
                Else : RemoveHandler Checkbox.CheckedChanged, AddressOf GroupBoxControl_Changed
                End If

            ElseIf TypeOf Control Is TextBox Then
                Dim TextBox = CType(Control, TextBox)
                If Not Remove Then : AddHandler TextBox.TextChanged, AddressOf GroupBoxControl_Changed
                Else : RemoveHandler TextBox.TextChanged, AddressOf GroupBoxControl_Changed
                End If

            ElseIf TypeOf Control Is MaskedTextBox Then
                Dim MaskedTextBox = CType(Control, MaskedTextBox)
                If Not Remove Then : AddHandler MaskedTextBox.TextChanged, AddressOf GroupBoxControl_Changed
                Else : RemoveHandler MaskedTextBox.TextChanged, AddressOf GroupBoxControl_Changed
                End If

            End If
        Next
    Next

End Sub

Observe que você precisará importar System.Linq e System.Windows.Forms para usar esta solução.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top