0

我有一个带有控制定义的 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”。为名。我发现没有它,函数不会返回任何东西。我认为这是因为我在构建表单时调用了该函数,所以还没有加载所有内容?

谢谢你的时间

4

3 回答 3

2

System.Windows.Forms是一个命名空间。它用于对属于一起的类进行分组。例如,与 Windows 窗体相关的所有内容都包含在System.Windows.Forms命名空间中。您的类在您的项目命名空间中,这就是为什么在以 . 为前缀时找不到它们的原因System.Windows.Forms

要了解有关命名空间的更多信息,请查看这篇旧但仍然有效的 MSDN 文章

现在,让我们回到你的问题。一个简单的解决方案是首先查看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
于 2012-10-22T13:48:47.210 回答
1

如果FindType("System.Windows.Forms." & elem.Name.ToString)没有找到任何东西,请尝试FindType(elem.Name.ToString)

如果您只传递名称,则看起来您链接的问题中的 FindType 代码应该找到它,因为它会查看正在执行的程序集中的所有类型。

于 2012-10-22T13:47:48.333 回答
0

那是因为没有System.Windows.Forms.MyControl课。
您需要为每个类确定正确的命名空间。

于 2012-10-22T13:45:03.043 回答