【问题标题】:how to solve Unable to cast object of type 'System.Windows.Forms.Form in VB.Net如何解决无法在 VB.Net 中转换类型为“System.Windows.Forms.Form”的对象
【发布时间】:2021-02-21 09:55:25
【问题描述】:

我有以下子程序:

Public Sub MyCodes_Users_Salahiyat()
    MyPubVar_Dt_Op_Salahiyat = New DataTable()
    MyPubVar_Dt_Op_Salahiyat.Columns.Add("Op_ID", Type.GetType("System.String"))
    MyPubVar_Dt_Op_Salahiyat.Columns.Add("FrmName", Type.GetType("System.String"))
    MyPubVar_Dt_Op_Salahiyat.Columns.Add("CmdName", Type.GetType("System.String"))
    MyPubVar_Dt_Op_Salahiyat.Columns.Add("FrmCaption", Type.GetType("System.String"))
    MyPubVar_Dt_Op_Salahiyat.Columns.Add("CmdCaption", Type.GetType("System.String"))

    Dim FormType As Type = Me.GetType().BaseType
    Dim xForms As List(Of Form) =
        (From t In [GetType]().Assembly.GetTypes()
         Where t.IsSubclassOf(FormType) = True Select DirectCast(Activator.CreateInstance(t), Form)).ToList()
    For Each xFrm In xForms
        Dim xCtrl As Control = xFrm.GetNextControl(xFrm, True)
        Dim xid As Integer
        Do Until xCtrl Is Nothing

            If xCtrl Is Nothing Then
                GoTo Line1
            Else
                If xCtrl.GetType = GetType(Button) Then
                    xid = xid + 1
                    MyPubVar_Dt_Op_Salahiyat.Rows.Add(xid, xFrm.Name, xCtrl.Name, xFrm.Text, xCtrl.Text)
                End If
            End If
Line1:
                xCtrl = xFrm.GetNextControl(xCtrl, True)
            Loop
        Next
End Sub

但是当我调用该过程时,我得到了以下错误:

无法将“CementAccSys.My.MyApplication”类型的对象转换为类型 'System.Windows.Forms.Form

奇怪的是,当我从另一个表单调用该过程时,错误不会出现!

【问题讨论】:

  • 在什么情况下你在这里调用Me?从?班级?显示包含此方法的类。也许您的意思是Form 的类型?此外,最好使用 Iterator 函数以递归方式获取控件,而不是 GoTo
  • 其实,我是从论坛上得到那个代码的,你能解释一下吗,我是个初学者。
  • 如果要获取当前项目的表格:Dim forms = Assembly.GetExecutingAssembly().GetTypes().Where(Function(t) GetType(Form).IsAssignableFrom(t))。循环并为Using .. End Using 块中的每个表单创建实例,然后完成剩下的工作。
  • 使用this方法获取控件。
  • @dr.null 我得到了表格,但是我怎样才能得到表格文本或表格名称?或者甚至对我们从代码中得到的所有表单进行循环?,谢谢

标签: vb.net


【解决方案1】:

获取正在运行的项目的Form控件和每个的Button控件:

Public Sub MyCodes_Users_Salahiyat()
    MyPubVar_....

    For Each f In Assembly.GetExecutingAssembly().GetTypes().
                Where(Function(t) GetType(Form).IsAssignableFrom(t))

        ' Create a Form and dispose of it when it is no longer needed...
        Using ins = DirectCast(Activator.CreateInstance(f), Form)
            ' You have a Form here, do what you need to do...
            Console.WriteLine($"{ins.Name}, {ins.Text}")

            For Each btn In GetAllControls(ins).OfType(Of Button)
                ' You have a button here belongs to the current Form...
                Console.WriteLine($"{btn.Name}, {btn.Text}")
            Next
        End Using
    Next
End Sub

' A recursive method to get all the controls...
Private Function GetAllControls(parent As Control) As IEnumerable(Of Control)
    Dim cs = parent.Controls.OfType(Of Control)
    Return cs.SelectMany(Function(c) GetAllControls(c)).Concat(cs)
End Function

【讨论】:

  • 我的代码有一个小问题,因为 Assembly 中的一个表单有一个自定义构造函数。
  • @Mary 使用this 过载。或创建该表单的实例。喜欢:Using ins = DirectCast(Activator.CreateInstance(Form1.GetType(), New Object() {param1, param2}), Form1) ... End Using 并传递参数。
  • 谢谢。由于此处的目的是迭代控件,因此只需添加默认构造函数即可修复它。
猜你喜欢
  • 1970-01-01
  • 2019-08-19
  • 1970-01-01
  • 1970-01-01
  • 2012-06-22
  • 2012-02-17
  • 1970-01-01
  • 2018-04-10
  • 1970-01-01
相关资源
最近更新 更多