Вопрос
У меня есть следующий код:
Private Sub txtFileFromLocation_TextChanged(ByVal sender As System.Object, ByVal e As System.Windows.Controls.TextChangedEventArgs)
MachineNameUIDisabled()
ServiceNameUIDisabled()
ToLocationUIDisabled()
btnSubmitUIDisabled()
lblStatusClear()
End Sub
Private Sub txtMachineName_TextChanged(ByVal sender As System.Object, ByVal e As System.Windows.Controls.TextChangedEventArgs)
ServiceNameUIDisabled()
ToLocationUIDisabled()
btnSubmitUIDisabled()
lblStatusClear()
End Sub
Private Sub txtServiceName_TextChanged(ByVal sender As System.Object, ByVal e As System.Windows.Controls.TextChangedEventArgs)
ToLocationUIDisabled()
btnSubmitUIDisabled()
lblStatusClear()
End Sub
Private Sub txtFilesToLocation_TextChanged(ByVal sender As System.Object, ByVal e As System.Windows.Controls.TextChangedEventArgs)
btnSubmitUIDisabled()
lblStatusClear()
End Sub
Я хочу объединить это в один сабвуфер без повторяющегося кода (все сабвуферы в настоящее время содержат btnSubmitUIDisabled()
и lblStatusClear()
)
Я думал о CASE
оператор, но это также будет иметь повторяющийся код.Это приложение WPF, и все события «TextChanged» расположены в xaml, поэтому в конце каждого подкаста нет «дескрипторов».
Заранее спасибо.
Решение
Ну, во-первых, вы можете каскадировать вызовы:
Private Sub txtFileFromLocation_TextChanged(ByVal sender As Object, _
ByVal e As TextChangedEventArgs)
MachineNameUIDisabled()
txtMachineName_TextChanged()
End Sub
Private Sub txtMachineName_TextChanged(ByVal sender As Object, _
ByVal e As TextChangedEventArgs)
ServiceNameUIDisabled()
txtServiceName_TextChanged()
End Sub
Private Sub txtServiceName_TextChanged(ByVal sender As Object, _
ByVal e As TextChangedEventArgs)
ToLocationUIDisabled()
txtFilesToLocation_TextChanged()
End Sub
Private Sub txtFilesToLocation_TextChanged(ByVal sender As Object,
ByVal e As TextChangedEventArgs)
btnSubmitUIDisabled()
lblStatusClear()
End Sub
Лично я бы на этом этапе назвал их по-другому — пусть метод говорит то, что он есть. делает а не что это реагирует на — но это всего лишь давняя разница во мнениях между мной и Visual Studio.
Другие советы
Псевдокод, как будто не такой уж и парень из VB:
Private Sub txt_TextChanged(ByVal sender As System.Object, ByVal e As System.Windows.Controls.TextChangedEventArgs)
if (sender.Name = txtServiceName)
MachineNameUIDisabled()
if (sender.Name = txtServiceName or sender.Name = txtMachineName)
ServiceNameUIDisabled()
if (sender.Name = txtServiceName or sender.Name = txtMachineName or sender.Name = txtFileFromLocation)
ToLocationUIDisabled()
btnSubmitUIDisabled()
lblStatusClear()
End Sub
Некрасиво, но один метод.
РЕДАКТИРОВАТЬ:Я не упомянул одну вещь: вам нужно привести отправителя к типу текстового поля, чтобы вы могли получить свойство name.
Если вы хотите, чтобы все это было в одном методе, тогда ответ @spinon — один из способов.Другой вариант — написать метод расширения, чтобы уменьшить количество операторов OrElse, которые вам нужно написать, и сделать код более читабельным.
Private Sub txt_TextChanged(ByVal sender As Object,
ByVal e As TextChangedEventArgs
)
Dim textBox = TryCast(sender, TextBox)
If textBox IsNot Nothing Then
If textBox.IsOneOf(txtServiceName) Then
MachineNameUIDisabled()
End If
If textBox.IsOneOf(txtServiceName, txtMachineName) Then
ServiceNameUIDisabled()
End If
If textBox.IsOneOf(txtServiceName, txtMachineName, txtFileFromLocation) Then
ToLocationUIDisabled()
End If
If textBox.IsOneOf(txtServiceName, txtMachineName, txtFileFromLocation,
txtFilesToLocation) Then
btnSubmitUIDisabled()
lblStatusClear()
End If
End If
End Sub
<Extension()>
Public Function IsOneOf(ByVal value As Object,
ByVal ParamArray values() As Object
) As Boolean
If value Is Nothing Then
Throw New ArgumentNullException("value")
End If
If values Is Nothing Then
Throw New ArgumentNullException("values")
End If
Return values.Contains(value)
End Function