2017-07-14 2 views
0

フォーム上にあるすべてのデータセットを検索して一覧表示することが可能かどうか質問したいと思います。Windows/DevXフォーム上のすべてのデータセットの検索

フォームコントロールでこれらを見つけることができませんでした。これらはVisual Studioフォームデザイナーを介して追加されました。ビルドしているソフトウェアには非常に多くの異なるデータセットが存在するため、しかし、それをどうにかしてリストに追加する必要があり、このトピックについては何も見つかりません。

List<DataSet> formSets = new List<DataSet>(); 
    //Operation to find all DataSets on the Form <--- This is what I'm looking for, 
    //probably a cycle which results in DataSet typed foundDataSet each time it executes. 
formSets.Add(foundDataSet) 
    //Number of other initializing operations like setting defaults and so on. 

DataSetsは厳密に型指定されていますが、コードでは既に一般的なDataSet操作を実行することを目指しています。

はまあ、私はデータセットのインスタンスはコントロールのコレクションの一部ではないことを認識し、少し考えた後、彼らはフォームクラスのメンバーだけである

グレー/ゲイリー・H.

+0

生成されたexeまたはdllを見ると、データセットが設計されたものか部分的なフォームのクラスかは関係ありません。コントロールをデータセットから継承するかどうかを調べるために、最初のエイブリィフォームを見つけて、再帰的にControlsプロパティを繰り返します。 – Oscar

+0

サンプルを提供できますか?私は、コードからフォームのコントロールリストを介してDataSetsにアクセスすることはできないようです。 – GrayBK

答えて

1

、事前にありがとうございます。 したがって、含まれているアセンブリをロードし、すべてのFormのサブクラスを取得してから、データセット型またはその継承を継承するすべてのメンバーを検索することです。次のコードは、反射

using System; 
using System.Linq; 
using System.Reflection; 
using System.Windows.Forms; 

namespace TypeFinder 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      // args[0]: Assembly path, args[1] Assembly containing type to find, args[2] Type to find 
      Type typeToFind = LoadTypeFrom(args[1], args[2]); 
      var forms = Assembly.LoadFrom(args[0]).GetTypes().Where(t => t.IsSubclassOf(typeof(Form))); 
      foreach (Type form in forms) 
      { 
       var fields = form.GetFields(BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public); 
       foreach (FieldInfo fieldInfo in fields) 
       { 
        if (IsSubclassOrSameTypeAs(typeToFind, fieldInfo.FieldType)) 
        { 
         Console.Out.WriteLine($"Found type {fieldInfo.FieldType} as IsSubclassOrSameTypeAs of {typeToFind}"); 
        } 
       } 
      } 
      Console.Out.WriteLine("Press any key to exit..."); 
      Console.ReadLine(); 
     } 

     private static bool IsSubclassOrSameTypeAs(Type baseType, Type descendant) 
     { 
      return descendant.IsSubclassOf(baseType) || descendant == baseType; 
     } 


     private static Type LoadTypeFrom(string path, string type) 
     { 
      if (string.IsNullOrEmpty(path)) 
      { 
       return Type.GetType(type, true, true); 
      } 
      var assembly = Assembly.LoadFrom(path); 
      return assembly.GetType(type, true, true); 
     } 

    } 
} 

を使用して、それをしなければならないあなたは、アセンブリのパスまたは完全修飾型名でこのプログラムを呼び出すことができます。

「C:\ MyCustomAssembly.dll」「C:\ MyCustomAssemblyWithTypeToFind.dll 「 "MyNamespace.MyCustomType"

"C:\ MyCustomAssembly.dll" "" "でSystem.Data.DataSet、System.Data、バージョン= 4.0.0.0、文化=中立、なPublicKeyToken = b77a5c561934e089"

・ホープこれは助けてくれます。

関連する問題