为什么我看不到通过反射动态创建的控件



我正试图掌握反射,因为我希望能够从我的程序集加载第三方程序集,从第三方程序集动态创建控件,然后以我创建的形式显示它。

我已经阅读了msdn文档,博客文章,谷歌搜索结果等,并通过实验得到了这一点。在下面的代码中,acmeccontrols是第三方Assembly,而AcmeLabel是我希望创建的控件,它具有一个带有get和set的Text属性。我确切地知道第三方程序集将在哪里找到,因此有一个单独的函数来确定它(为了清晰起见,下面没有显示)。

Public Sub CreateDynamicLabelViaReflection()
    Dim type As System.Type
    Dim asm As Assembly = Assembly.LoadFrom(GetAssemblyName("AcmeControls.dll"))
    Dim obj As System.Object

    type = asm.GetType("AcmeControls.AcmeLabel")
    obj = Activator.CreateInstance(type, New Object() {})
    Dim textProp As PropertyInfo = type.GetProperty("Text")
    Dim textPropSet As MethodInfo = textProp.GetSetMethod
    Dim newAl As Object = Activator.CreateInstance(type)
    textPropSet.Invoke(newAl, New Object() {"here is my text"})

    Dim frm As New Form With {.Text = "Hello"}
    frm.Controls.Add(newAl)
    frm.Show()
    For Each ctrl As Control In frm.Controls
        MessageBox.Show(ctrl.Location.ToString) 'ctrl.GetType.ToString here returns AcmeLabel
    Next
End Sub

然后我有一个单独的项目,引用该代码所在的程序集,并在该项目中的按钮单击事件中调用createddynamiclabelviareflection()。

我最终得到的是一个表单,但没有明显的迹象表明AcmeLabel存在于表单上。然而,它也没有抛出任何错误,所以我假设这段代码可能部分工作,这导致我在底部添加For each循环。当然,在表单控件集合中有一个控件,它是一个AcmeLabel(位置X = 0, y = 0),但是我不能看到它或理论上我早先添加到它的文本。

我显然错过了一个重要的步骤,但我不确定这一步是什么,有人能帮助我更好地理解这个过程吗?

谢谢

在您的代码中更改此更改

   Dim frm As New Form With {.Text = "Hello"}
   frm.Controls.Add(newAl)
   newA1.visible=true
   frm.Show()

相关内容

  • 没有找到相关文章

最新更新