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

How to move textbox events to other file - VB6 to VB.NET?

我正在改造用 VB6 构建的旧应用程序,VB.NET 和 Visual Studio 2005。

它有一个大表单,有 50-60 个文本框,每个文本框有 2-3 个事件处理程序,单击、验证、按键、输入等...

构建这个应用程序的人没有注意保持良好的结构,所以现在表单的代码文件将近 2900 行代码。

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

问题是,这些事件处理程序中的每一个都被定义为私有的,并引用仅存在于表单代码文件中的 objects/textboxes。

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

这是一个示例代码,由于我是菜鸟 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

将大型 class 分成小部分的最简单方法是使用 Partial class

的概念

只需创建一个新的 class 文件并将其命名为您的大表单 class 但在两个 class 之前添加关键字 Partial .现在您可以将所有事件处理程序移动到第二个文件,从而使您的主窗体从这些东西中解放出来

请参阅 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.....

或者,如果您也发现这种方法 'verbose',只需使用 Winforms 设计器 select 所有控件的相同事件处理程序

如果您发布的示例代码是指示性的,那么很多代码可能只是用于浏览表单。

您可以通过正确设置 Tab 键顺序来删除其中的大部分内容。

对于特殊的导航键(例如,左箭头键有特殊作用,或者您希望 ENTER 键像 TAB 键一样移动到下一个控件),请尝试设置 Form.KeyPreview = True 并在表单范围内设置 KeyUp/KeyDown/KeyPress例程。