Как я могу сократить этот код до одной процедуры - PullRequest
2 голосов
/ 16 января 2012

Я относительно новичок во всем .NET, исходя из классического фона VB.

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

Как я могу оптимизировать эти процедуры в одну процедуру?

    Private Sub cboCalc0_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cboCalc0.SelectedIndexChanged
    'Page 0
    If (Not (IsNothing(trvSignals0.SelectedNode)) And txtSignalName0.Enabled = True) AndAlso trvSignals0.SelectedNode.Level = 3 Then
        tempChannelProp(0, trvSignals0.SelectedNode.Tag).CalcVariant = cboCalc0.SelectedIndex
    End If
End Sub

Private Sub cboCalc1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cboCalc1.SelectedIndexChanged
    'Page 1
    If (Not (IsNothing(trvSignals1.SelectedNode)) And txtSignalName0.Enabled = True) AndAlso trvSignals1.SelectedNode.Level = 3 Then
        tempChannelProp(1, trvSignals1.SelectedNode.Tag).CalcVariant = cboCalc1.SelectedIndex
    End If
End Sub

Private Sub cboCalc2_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cboCalc2.SelectedIndexChanged
    'Page 2
    If (Not (IsNothing(trvSignals2.SelectedNode)) And txtSignalName2.Enabled = True) AndAlso trvSignals2.SelectedNode.Level = 3 Then
        tempChannelProp(2, trvSignals2.SelectedNode.Tag).CalcVariant = cboCalc2.SelectedIndex
    End If
End Sub

Private Sub cboCalc3_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cboCalc3.SelectedIndexChanged
    'Page 3
    If (Not (IsNothing(trvSignals3.SelectedNode)) And txtSignalName3.Enabled = True) AndAlso trvSignals3.SelectedNode.Level = 3 Then
        tempChannelProp(3, trvSignals3.SelectedNode.Tag).CalcVariant = cboCalc3.SelectedIndex
    End If
End Sub

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

    Private Sub trvSignals_AfterCheck(ByVal sender As Object, ByVal e As System.Windows.Forms.TreeViewEventArgs) Handles trvSignals0.AfterCheck, trvSignals1.AfterCheck, trvSignals2.AfterCheck, trvSignals3.AfterCheck
    'Handles Page 0,1,2,3
    sender.SelectedNode = e.Node
    If e.Node.Level = 3 Then
        tempChannelProp(sender.tag, e.Node.Tag).Active = e.Node.Checked
    End If
End Sub

Я использую свойство tag элемента управления каждой страницы для хранения 0,1,2 или 3, в зависимости от ситуации.

Спасибо

Graham

Ответы [ 3 ]

1 голос
/ 16 января 2012

Создайте массивы элементов управления, на которые вы можете ссылаться по индексу, и поместите индекс в тег каждого элемента управления.

Class MyForm

    Private ReadOnly cboCalcArray As ComboBox()
    Private ReadOnly trvSignalsArray As TreeView()
    Private ReadOnly txtSignalNameArray As TextBox()

    Public Sub New()
        InitializeComponent()
        cboCalcArray = new ComboBox() {cboCalc0, cboCalc1, cboCalc2, cboCalc3}
        trvSignalsArray = new TreeView() {trvSignals0, trvSignals1, trvSignals2, trvSignals3}
        txtSignalNameArray = new TextBox() {txtSignalName0, txtSignalName1, txtSignalName2, txtSignalName3}
    End Sub

    Private Sub cboCalcX_SelectedIndexChanged(ByVal sender As Object, ByVal e As EventArgs) _
        Handles cboCalc0.SelectedIndexChanged, 
                cboCalc1.SelectedIndexChanged, 
                cboCalc2.SelectedIndexChanged, 
                cboCalc3.SelectedIndexChanged
        Dim index As Integer = sender.Tag
        If (Not (IsNothing(trvSignalsArray(index).SelectedNode)) And txtSignalNameArray(index).Enabled = True) AndAlso trvSignals2.SelectedNode.Level = 3 Then      
            tempChannelProp(index, trvSignalsArray(index).SelectedNode.Tag).CalcVariant = cboCalcArray(index).SelectedIndex      
        End If      
    End Sub
End Class
0 голосов
/ 16 января 2012

Возможно, где-то есть более элегантное решение вашей проблемы.Я обнаружил, что если я определяю те же элементы управления и методы для нескольких вкладок в элементе управления вкладками, возможно, пришло время проверить мой дизайн.,,Хотя не всегда.: -)

Это может быть немного менее неуклюже, хотя использование Select Case для выбора между идентичными конфигурациями элементов пользовательского интерфейса дает мне heebie-jeebies (однако, он ДЕЛАЕТ весь ваш код в один обработчик):

    Private Sub PerformCalcs(ByVal sender As Object, ByVal e As System.EventArgs) _
        Handles _
        cboCalc0.SelectedIndexChanged,
        cboCalc1.SelectedIndexChanged,
        cboCalc2.SelectedIndexChanged,
        cboCalc3.SelectedIndexChanged

        Dim cboCalc As ComboBox = DirectCast(sender, ComboBox)

        ' The Parent of the combo box is the TabPage, and the Parent of the TabPage is the TabControl:
        Dim t As TabControl = cboCalc.Parent.Parent

        Dim SelectedNode As TreeNode
        Dim TxtSignalName As TextBox

        ' The TabControl knows the index value of the currently selected tab:
        Select Case t.SelectedIndex
            Case 0 'Page 0
                SelectedNode = trvSignals0.SelectedNode
                TxtSignalName = txtSignalName0
            Case 1 ' Page 1
                SelectedNode = trvSignals1.SelectedNode
                TxtSignalName = txtSignalName1
            Case 2 ' Page 2
                SelectedNode = trvSignals2.SelectedNode
                TxtSignalName = txtSignalName2
            Case 3 ' Page 3
                SelectedNode = trvSignals3.SelectedNode
                TxtSignalName = txtSignalName3
            Case Else ' Ooops! Something horrible happened!
                Throw New System.Exception("You have passed an invalid Control as a parameter")
        End Select

        If (Not (IsNothing(SelectedNode)) And TxtSignalName.Enabled = True) AndAlso trvSignals3.SelectedNode.Level = 3 Then
            tempChannelProp(3, SelectedNode.Tag).CalcVariant = cboCalc.SelectedIndex
        End If

    End Sub
0 голосов
/ 16 января 2012

Вы можете использовать несколько функций:

1) Оператор VB Handles может привязать несколько событий управления к одному и тому же методу.

2) Вы можете получить комбинированный список от отправителя,затем извлеките индекс.

3) Из индекса вы можете найти другие связанные элементы управления.

Private Sub cboCalc_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cboCalc0.SelectedIndexChanged, cboCalc1.SelectedIndexChanged, cboCalc2.SelectedIndexChanged, cboCalc3.SelectedIndexChanged

    Dim oCombo As ComboBox

    oCombo = DirectCast(sender, ComboBox)

    Dim wIndex As Integer
    Dim oTree As TreeView
    Dim oTextBox As TextBox

    wIndex = CInt(oCombo.Name.Substring(oCombo.Name.Length - 1))

    oTree = DirectCast(Me.Controls.Find("trvSignals" & wIndex.ToString, True)(0), TreeView)
    oTextBox = DirectCast(Me.Controls.Find("txtSignalName" & wIndex.ToString, True)(0), TextBox)

    If oTree.SelectedNode IsNot Nothing AndAlso oTextBox.Enabled AndAlso oTree.SelectedNode.Level = 3 Then
        tempChannelProp(wIndex, oTree.SelectedNode.Tag).CalcVariant = oCombo.SelectedIndex
    End If

End Sub
...