我有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%的信息。
感谢所有人!
答案 0 :(得分:0)
设计不佳但你可以这样做:
Public Sub CleanupForm(ByVal frm As Form)
Dim frmTest as object = frm
? = frmTest.TABLE_NAME
? = frmTest.Rec_Lock
End Sub
这将编译,如果变量存在,它将返回它们,但如果不存在,则会出现错误。
事实并非那么难以转换为界面,你应该现在而不是以后再做。