Detectar quando algum dos controles dentro de uma caixa de grupo foi alterado
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
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.