一貫した名前のパブリック変数を持つ 20 以上の MDI フォームがあります。子フォームが閉じると、MDI 親のメソッドが呼び出され、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 フォーム、.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() アプローチでは。
リフレクションは、Public と宣言されていないフォーム レベル変数を取得できますか? セキュリティ上の問題のようですが...
インスタンス化された Locks クラスで「親」参照を取得できますか? つまり、Locks オブジェクトを確立したフォームへの参照ですか? clsRecLocks() クラスを変更できます。
取得できるプロパティを見つけて、フォームが「読み取り専用」であると教えてくれました。その情報を使用して、正しい(またはより正確な - まだ 100% ではない)ロック レコードを削除できます。したがって、バグは 90% 修正されています。100% に到達するために必要な情報を記録するコードを使用して、すべてのフォームを更新する必要があると思います。
ありがとうございます!