如何将此代码减少到单个过程

时间:2012-01-16 01:48:37

标签: vb.net optimization procedures

对于整个.NET来说,我相对较新,来自VB经典背景。

在我的表单上,我有一个tabcontrol,有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。

由于

格雷厄姆

3 个答案:

答案 0 :(得分:1)

创建可以通过索引引用的控件数组,并将索引放在每个控件的Tag中。

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

答案 1 :(得分:0)

您可以利用以下几项功能:

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

答案 2 :(得分:0)

在某个地方,您的问题可能会有更优雅的解决方案。我发现,如果我在选项卡控件上为multiplpe选项卡定义相同的控件和方法,可能是时候检查我的设计了。 。 。但并不总是如此。 : - )

这可能不那么笨拙,虽然使用Select Case在UI元素的其他相同配置之间进行选择会给我带来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