-1

我有 20 多个具有一致命名公共变量的 MDI 表单。当子窗体关闭 MDI Parent 上的方法时,称为将 Me 作为通用窗体类型传递。如何通过表单引用按名称访问公共变量?我只需要读取变量。当然 Variables() 方法不存在...

Public Sub CleanupForm(ByVal frm As Form)
    Dim sTable_Name As String = frm.Variables("TABLE_NAME") ' Public at form level
    Dim cLock As clsRecLocks
    cLock = frm.Variables("Rec_Lock")
    cLock.DeleteThisLock()
    '..

我看过一些关于类似请求的帖子,但大多数都是从“不要那样做......”开始的,然后在杂草中没有回答这个问题。我承认这是糟糕的设计。我不能在短期内改变所有的调用形式,所以我需要使用这种方法。

VS2010, VB.Net, Win Forms, .Net 2.0


我能够使用 CallByName 获得一个简单的变量:

    Try
        Dim s As String = CallByName(frm, "TABLE_NAME", CallType.Get)
        Stop
    Catch ex As Exception
        MsgBox(ex.Message)
    End Try

到类对象。也许我可以为返回我需要的 ID 的类添加一个默认的 Get。


默认属性将不起作用,因为 Locks 对象未声明为 Public - 至少对于 CallByName() 方法。

反射可以形成未声明为公共的级别变量吗?似乎是一个安全问题,但...

我可以在实例化的 Locks 类中获得“父”引用吗?即对建立 Locks 对象的表单的引用?我可以更改 clsRecLocks() 类。


我找到了一个可以访问的属性,告诉我该表单是“只读的”,我可以使用该消息删除正确的(或更正确的 - 仍然不是 100%)锁定记录。因此,该错误已修复 90%。我想我需要使用记录我需要达到 100% 的信息的代码来更新所有表单。

谢谢大家!

4

1 回答 1

0

糟糕的设计,但你可以这样做:

Public Sub CleanupForm(ByVal frm As Form)
  Dim frmTest as object = frm
  ? = frmTest.TABLE_NAME
  ? = frmTest.Rec_Lock
End Sub

这将编译,如果变量存在,它将返回它们,但如果不存在,则会出现错误。

事后转换为接口并不难,你应该现在而不是以后做。

于 2013-09-30T18:47:38.260 回答