You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将Form名称传递给执行命令的通用函数?

通用表单导航按钮状态控制问题

我有6个表单,它们的导航栏按钮完全一致。点击导航栏按钮时,无论当前处于哪个表单,都需要执行相同的按钮启用/禁用逻辑。我想编写一个通用函数来处理所有表单的按钮状态,但尝试多种方法都无效。

当前代码示例

编辑按钮点击事件

Private Sub cmdEdit_Click(sender As Object, e As EventArgs) Handles cmdEdit.Click
    'Edit Record - Button 6
    'Stop
    Dim OK As Boolean
    IsEditing = True

    OK = Button_Edit("Creditors")
    'OK = Button_Edit(Creditors) - fail

End Sub

被调用的通用函数

Public Function Button_Edit(ByRef FrmName As Form) As Boolean
    Stop
    'With FrmName
    FrmName.Controls("cmdFirst").Enabled = False
    FrmName.Controls("cmdPrevious").Enabled = False
    FrmName.Controls("cmdNext").Enabled = False
    FrmName.Controls("cmdLast").Enabled = False

    FrmName.Controls("cmdSearch").Enabled = False

    FrmName.Controls("cmdEdit").Enabled = False
    FrmName.Controls("cmdAdd").Enabled = False

    FrmName.Controls("cmdDelete").Enabled = False

    FrmName.Controls("cmdSave").Enabled = True
    FrmName.Controls("cmdReject").Enabled = True

    FrmName.Controls("cmdReports").Enabled = False

    FrmName.Controls("cmdPrint").Enabled = False
    FrmName.Controls("cmdExit").Enabled = True
    'End With
    Return True
End Function

可行解决方法

方法1:传递当前表单实例

直接把当前表单的Me关键字传给函数,无需硬编码表单名称:

Private Sub cmdEdit_Click(sender As Object, e As EventArgs) Handles cmdEdit.Click
    IsEditing = True
    Dim OK As Boolean = Button_Edit(Me)
End Sub

函数会直接操作当前激活的表单,逻辑无需修改。

方法2:同步所有打开的表单

如果需要点击按钮时,所有已打开的表单同步按钮状态,修改函数如下:

Public Function Button_Edit() As Boolean
    '遍历所有打开的表单
    For Each frm As Form In Application.OpenForms
        '检查表单是否包含导航按钮,避免出错
        If frm.Controls.ContainsKey("cmdFirst") Then
            frm.Controls("cmdFirst").Enabled = False
            frm.Controls("cmdPrevious").Enabled = False
            frm.Controls("cmdNext").Enabled = False
            frm.Controls("cmdLast").Enabled = False

            frm.Controls("cmdSearch").Enabled = False
            frm.Controls("cmdEdit").Enabled = False
            frm.Controls("cmdAdd").Enabled = False
            frm.Controls("cmdDelete").Enabled = False

            frm.Controls("cmdSave").Enabled = True
            frm.Controls("cmdReject").Enabled = True

            frm.Controls("cmdReports").Enabled = False
            frm.Controls("cmdPrint").Enabled = False
            frm.Controls("cmdExit").Enabled = True
        End If
    Next
    Return True
End Function

调用时直接执行:

Private Sub cmdEdit_Click(sender As Object, e As EventArgs) Handles cmdEdit.Click
    IsEditing = True
    Dim OK As Boolean = Button_Edit()
End Sub

方法3:创建基类表单(规范长期方案)

  1. 新建基类表单BaseNavigationForm,统一管理导航按钮和状态逻辑:
Public Class BaseNavigationForm
    Inherits Form

    '声明所有导航按钮,确保子表单按钮名称与这里一致
    Protected WithEvents cmdFirst As Button
    Protected WithEvents cmdPrevious As Button
    Protected WithEvents cmdNext As Button
    Protected WithEvents cmdLast As Button
    Protected WithEvents cmdSearch As Button
    Protected WithEvents cmdEdit As Button
    Protected WithEvents cmdAdd As Button
    Protected WithEvents cmdDelete As Button
    Protected WithEvents cmdSave As Button
    Protected WithEvents cmdReject As Button
    Protected WithEvents cmdReports As Button
    Protected WithEvents cmdPrint As Button
    Protected WithEvents cmdExit As Button

    '通用编辑状态设置方法
    Protected Sub SetEditMode()
        cmdFirst.Enabled = False
        cmdPrevious.Enabled = False
        cmdNext.Enabled = False
        cmdLast.Enabled = False

        cmdSearch.Enabled = False
        cmdEdit.Enabled = False
        cmdAdd.Enabled = False
        cmdDelete.Enabled = False

        cmdSave.Enabled = True
        cmdReject.Enabled = True

        cmdReports.Enabled = False
        cmdPrint.Enabled = False
        cmdExit.Enabled = True
    End Sub

    '可扩展其他状态方法,比如浏览模式、新增模式
End Class
  1. 让6个业务表单都继承自BaseNavigationForm:
Public Class CreditorsForm
    Inherits BaseNavigationForm

    Private Sub cmdEdit_Click(sender As Object, e As EventArgs) Handles cmdEdit.Click
        IsEditing = True
        '设置当前表单状态
        SetEditMode()
        '同步所有已打开的导航表单状态
        For Each frm As BaseNavigationForm In Application.OpenForms.OfType(Of BaseNavigationForm)()
            frm.SetEditMode()
        Next
    End Sub
End Class

这种方式能统一管理所有导航逻辑,后续修改只需调整基类,代码更易维护。


内容的提问来源于stack exchange,提问作者MGC

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 16:43:29