后期绑定到表单的公共变量

时间:2013-09-30 18:06:16

标签: vb.net winforms

我有20多个MDI表单,一致命名为Public变量。当子窗体关闭MDI上的方法时,调用Parent作为通用窗体类型传递Me。如何通过Form引用按名称访问公共变量?我只需要阅读变量。当然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类中获得“Parent”引用吗?即对建立Locks对象的表单的引用?我可以更改clsRecLocks()类。


我找到了一个可以获得的属性,告诉我该表单是“只读”,我可以使用该tidbit删除正确的(或更正确 - 仍然不是100%)锁定记录。所以这个bug已经修复了90%。我想我需要使用代码更新所有表单,这些代码记录了我需要达到100%的信息。

感谢所有人!

1 个答案:

答案 0 :(得分:0)

设计不佳但你可以这样做:

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

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

事实并非那么难以转换为界面,你应该现在而不是以后再做。