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>

Ok。ご覧のとおり、この例では、1つのTabPageを持つ1つのtabControlがあります。TabPageには、1つのTextBoxと1つのMyControlがあります。

xmlを読み取り、MyControlを除くすべてのコントロールを追加できます。その理由は、タイプが見つからないためです。説明:xmlを実行してコントロールを追加するために、それがどのタイプであるかを見つけたいと思います。したがって、次のコード行を使用します。

   Dim oType As Type = FindType("System.Windows.Forms." & elem.Name.ToString)

FindTypeは、私がここで見つけた関数です。.NETの文字列からTypeオブジェクトを取得するための最良の方法

残念ながら、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つのカスタムコントロールがあることです。将来的にはさらに追加する予定です。何か一般的なものを作る方法はありますか?

もう1つの質問は、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 に答える