如何将文本框事件移动到其他文件 - VB6到VB.NET?

时间:2017-09-26 13:16:40

标签: vb.net vb6 visual-studio-2005 upgrade

我正在使用VB.NET和Visual Studio 2005重新编写VB6内置的旧应用程序。

它有一个大型表格,有50-60个文本框,每个文本框有2-3个事件处理程序,点击,验证,keydown,输入等......

构建此应用程序的人并没有注意保持良好的结构,所以现在表单的代码文件几乎是2900行代码。

它有3-4个重要的功能,其他功能只是事件处理程序。

问题是,每个事件处理程序都被定义为私有,并引用仅存在于表单代码文件中的对象/文本框。

将这些事件处理程序移动到单独文件的正确方法是什么?

这是一个示例代码,由于我是noob VB.NET程序员,我无法移动到单独的文件中:

Imports System.Windows.Forms

Public Class Pol

    Private cboPol As MaskedTextBox = New MaskedTextBox()

    Private Sub cboPol_Enter(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) 'Handles cboPol.Enter
        ' TODO ova beshe zakomentirano. Da se proveri
        'meGodrag.SelStart = 0
        ' meGodrag.SelLength = 4
        'grstar = meGodrag.Text
    End Sub

    Private Sub cboPol_KeyDown(ByVal eventSender As System.Object, ByVal eventArgs As System.Windows.Forms.KeyEventArgs) 'Handles cboPol.KeyDown
        Dim KeyCode As Short = eventArgs.KeyCode
        Dim Shift As Short = eventArgs.KeyData \ &H10000
        If KeyCode = Constants.LEFT_ARROW_KEY Then
            'meNasmes.Focus()
        End If
    End Sub

    Private Sub cboPol_KeyPress(ByVal eventSender As System.Object, ByVal eventArgs As System.Windows.Forms.KeyPressEventArgs) 'Handles cboPol.KeyPress
        Dim KeyAscii As Short = Asc(eventArgs.KeyChar)
        'If KeyAscii = Constants.ENTER_KEY Then
        System.Windows.Forms.SendKeys.Send(Constants.TAB_KEY)
        'End If
        eventArgs.KeyChar = Chr(KeyAscii)
        If KeyAscii = 0 Then
            eventArgs.Handled = True
        End If
    End Sub
End Class

2 个答案:

答案 0 :(得分:2)

通过使用Partial class

的概念,将小型部分分成小部分的最简单方法是

只需创建一个新的类文件并将其命名为大型表单类,但在两个类之前添加关键字部分。现在,您可以将所有事件处理程序移动到第二个文件,从而将主表单从这些内容中释放出来

请参阅How to split a class into partial classes

上的MSDN

在更结构化的解决方案中,您可以检查是否可以为同一事件创建唯一的事件处理程序,并强制您的控件使用相同的事件处理程序。

例如,如果KeyDown事件的操作对于所有控件都相同,那么您可以编写单个事件处理程序并告诉控件使用它

Private Sub allControls_KeyDown(ByVal eventSender As System.Object, ByVal eventArgs As System.Windows.Forms.KeyEventArgs) 
     Handles cboPol.KeyDown, cboXXXX.KeyDown, cboYYYY.KeyDown etc.....

或者,如果您发现此方法过于“冗长”,只需使用Winforms设计器为所有控件选择相同的事件处理程序

答案 1 :(得分:1)

如果您发布的示例代码是指示性的,则可能有很多代码仅用于导航表单。

您可以通过正确设置标签顺序来删除大部分内容。

对于特殊导航键(例如,左箭头键执行特殊操作,或者您希望ENTER键移动到下一个控件,如TAB键),请尝试设置Form.KeyPreview = True并使用表单范围{{1} } / KeyUp / KeyDown例程。