VB中实现类似VFP的宏替换?ThisForm替换BsGroupMaster报错求助
VB中实现类似VFP宏替换的对象引用方案
VB作为强类型语言,没有VFP那种直接的&宏替换语法,但可以通过以下两种方式实现你的需求,优先推荐类型安全的方案:
方法1:直接传递窗体实例(推荐)
不要用字符串传递窗体名称,直接传入窗体的实例对象,这是最符合VB编码规范的类型安全做法:
Public Sub Eof(ByVal ThisForm As BsGroupMasterForm) ' 替换为你的窗体类实际类型 If ThisForm.MyDataTbl.Rows.Count = 0 Then ' Data file is empty MessageBox.Show("Data file is empty, There are no records. ") ElseIf ThisForm.MyRowPosition = (ThisForm.MyDataTbl.Rows.Count - 1) Then MessageBox.Show("Check End of file reached, No next record exists.", "", MessageBoxButtons.OK, MessageBoxIcon.Information) ElseIf ThisForm.MyRowPosition < (ThisForm.MyDataTbl.Rows.Count - 1) Then ' There are records ThisForm.MyRowPosition = ThisForm.MyRowPosition + 1 ThisForm.showRecords() End If End Sub
调用时直接传窗体实例即可:
Eof(BsGroupMaster)
方法2:反射实现字符串到对象的映射(仅特殊场景使用)
如果必须通过字符串名称获取对象,可以用反射实现动态解析,但这种方式性能差且容易出错,仅作为备选:
场景1:目标是打开的窗体实例
Imports System.Reflection Imports System.Windows.Forms Public Sub Eof(ByVal ThisForm As String) ' 从当前打开的窗体中匹配名称 Dim targetForm As Form = Application.OpenForms.OfType(Of Form).FirstOrDefault(Function(f) f.Name = ThisForm) If targetForm Is Nothing Then MessageBox.Show("找不到指定窗体") Return End If ' 转换为目标窗体类型 Dim bsForm As BsGroupMasterForm = TryCast(targetForm, BsGroupMasterForm) If bsForm Is Nothing Then MessageBox.Show("窗体类型不匹配") Return End If ' 后续逻辑替换为bsForm调用 If bsForm.MyDataTbl.Rows.Count = 0 Then MessageBox.Show("Data file is empty, There are no records. ") ElseIf bsForm.MyRowPosition = (bsForm.MyDataTbl.Rows.Count - 1) Then MessageBox.Show("Check End of file reached, No next record exists.", "", MessageBoxButtons.OK, MessageBoxIcon.Information) ElseIf bsForm.MyRowPosition < (bsForm.MyDataTbl.Rows.Count - 1) Then bsForm.MyRowPosition = bsForm.MyRowPosition + 1 bsForm.showRecords() End If End Sub
场景2:目标是静态类实例
如果BsGroupMaster是静态类,反射方式调整为:
Imports System.Reflection Public Sub Eof(ByVal ThisForm As String) ' 获取目标类类型 Dim targetType As Type = Type.GetType(ThisForm) If targetType Is Nothing Then MessageBox.Show("找不到指定类型") Return End If ' 获取类的静态成员 Dim myDataTblProp As PropertyInfo = targetType.GetProperty("MyDataTbl", BindingFlags.Public Or BindingFlags.Static) Dim myRowPositionProp As PropertyInfo = targetType.GetProperty("MyRowPosition", BindingFlags.Public Or BindingFlags.Static) Dim showRecordsMethod As MethodInfo = targetType.GetMethod("showRecords", BindingFlags.Public Or BindingFlags.Static) If myDataTblProp Is Nothing Or myRowPositionProp Is Nothing Or showRecordsMethod Is Nothing Then MessageBox.Show("类成员不存在") Return End If ' 读取和修改静态成员 Dim dataTbl As DataTable = DirectCast(myDataTblProp.GetValue(Nothing), DataTable) Dim rowPosition As Integer = DirectCast(myRowPositionProp.GetValue(Nothing), Integer) If dataTbl.Rows.Count = 0 Then MessageBox.Show("Data file is empty, There are no records. ") ElseIf rowPosition = (dataTbl.Rows.Count - 1) Then MessageBox.Show("Check End of file reached, No next record exists.", "", MessageBoxButtons.OK, MessageBoxIcon.Information) ElseIf rowPosition < (dataTbl.Rows.Count - 1) Then myRowPositionProp.SetValue(Nothing, rowPosition + 1) showRecordsMethod.Invoke(Nothing, Nothing) End If End Sub
内容的提问来源于stack exchange,提问作者Satjinder Singh
相关产品推荐
相关产品推荐

