我有一个带控件定义的xml
<?xml version="1.0" encoding="utf-8"?>
<Controls>
<TabControl>
<Properties>
<Dock>5</Dock>
</Properties>
<TabPage>
<TextBox>
<Properties>
<Text>Id:</Text>
<Location>106,12</Location>
<Size>113,20</Size>
<BorderStyle>2</BorderStyle>
</Properties>
</TextBox>
<MyControl>
<Properties>
<Visible>True</Visible>
<Location>106,33</Location>
<Size>113,20</Size>
<Enabled>True</Enabled>
<BorderStyle>2</BorderStyle>
<Text>Action:</Text>
<TabIndex>0</TabIndex>
</Properties>
</MyControl>
<Properties>
<Text>Details</Text>
</Properties>
</TabPage>
</TabControl>
</Controls>
确定。正如您所看到的,我在此示例中有一个tabControl,其中包含一个TabPage。 TabPage有一个TextBox和一个MyControl。
我能够读取xml并添加除MyControl之外的所有控件。 原因是我找不到这种类型。 说明: 为了运行xml并添加控件,我想找到它的类型。所以我使用这行代码:
Dim oType As Type = FindType("System.Windows.Forms." & elem.Name.ToString)
FindType是我在这里找到的一个函数:Best way to get a Type object from a string in .NET
不幸的是我无法弄清楚要在此函数中添加什么来查找MyControl。 MyControl只是添加到我的解决方案中的自定义控件。
我知道我可以在FindType函数中使用if
if base is Nothing then
if name.Contains("MyControl")Then
base = GetType(MyControl)
End If
End If
If base IsNot Nothing Then Return base
我的问题是我有3个自定义控件,将来我可能会添加更多。 有什么方法可以通用吗?
另一个问题是在FindType函数中我必须使用“System.Windows.Forms”。为了这个名字。 我发现没有它,该功能不会返回任何东西。 我想这是因为我在构建表单时调用了该函数,所以并不是所有内容都被加载了吗?
感谢您的时间
答案 0 :(得分:2)
System.Windows.Forms
是命名空间。它习惯于属于一起的组类。例如,与Windows窗体相关的所有内容都包含在System.Windows.Forms
命名空间中。您的类位于项目命名空间中,这就是为什么在使用System.Windows.Forms
作为前缀时找不到它们。
要了解有关命名空间的更多信息,请查看此old, but still valid MSDN article。
现在,让我们回到你的问题。一个简单的解决方案是首先查看System.Windows.Forms
命名空间,然后查看您自己的命名空间:
Function FindTypeEx(typeName As String) As Type
Dim type = FindType("System.Windows.Forms." & typeName)
If type Is Nothing Then
type = FindType(typeName) ' Without the prefix
End If
Return type
End Function
答案 1 :(得分:1)
如果FindType("System.Windows.Forms." & elem.Name.ToString)
找不到任何内容,请尝试FindType(elem.Name.ToString)
看起来你链接的问题中FindType的代码应该找到它,如果你只传递名称,因为它会查看正在执行的程序集中的所有类型。
答案 2 :(得分:0)
那是因为没有System.Windows.Forms.MyControl
类
您需要为每个类确定正确的命名空间。