2

多数のプロパティを持つカスタム クラスを指定して、オプション (設定) フォームを作成できる優れたコンポーネント (C# WinForms) を知っている人はいますか? 光沢のあるものを探しているのではなく、単にプロパティ グリッドよりも優れたものを探しています。視覚的な部分は簡単に処理できますが、コントロールが既に存在する場合は、リフレクションを追加してバインドするために時間を無駄にしたくありません。

動的に作成された (グループ化と追加情報を可能にするために、クラスのプロパティにいくつかの属性が関連付けられている) Visual Studio のオプションのようなフォームを以前どこかで見たことがあると確信しています。

[編集]たとえば、オプション クラスがあるとします。

public class Options : SerializableOptions<Options>
{
     [Category("General")]
     [Name("User name")]
     [Description("Some text")]
     public string Username { get; set; }

     [Category("General")]
     [Name("Log in automatically")]
     public bool LogInAutomatically { get; set; }

     [Category("Advanced")]
     // ConnectionType is enum
     public ConnectionType ConnectionType { get; set; }

     // ...
}

このフォームに渡すと、2 つのパネル ("General" と "Advanced") が作成されます。最初のパネルには CheckBox と TextBox があり、2 番目のパネルには 1 つの ComboBox (使用可能なすべての列挙型を含む) があります。

そのようなコントロールがない場合、皆さんは何を使用しますか? 各オプションのコントロールを手動で追加、設定、フォーマット、およびバインドしますか?

4

3 に答える 3

2

これを可能にするコントロールについては知りませんが、自分で行うのは難しくありません。最も簡単な方法は、ダイアログ シェル、オプション「パネル」の基本クラスとして機能するユーザー コントロール、名前とグループ化情報を制御する 1 つ (または複数) の属性、およびインターフェイス (ユーザー コントロールが実装する) を作成することです。 .

カスタム オプション パネルのそれぞれは、ユーザー コントロールから派生し、ある種のメソッド (ユーザー コントロールによって提供される) をオーバーライドしInitialize()ますSave()。また、名前/グループ化情報を決定する属性 (または属性) も提供します。

ダイアログ シェルで、アセンブリ (または読み込まれたすべてのアセンブリ) のすべてのパブリック型を反射的に検査して、インターフェイスを実装する型を探します。型を見つけたら、属性を取得してグループ内のどこに配置するかを決定し (ここで最も簡単なのはツリー ビューを使用することです)、呼び出し Activator.CreateInstanceてユーザー コントロールのインスタンスを作成し、それをプロパティに格納しTagます。ユーザーがグループ内のエントリ (ツリー ノード) をクリックすると、 が取得Tagされ、ユーザー コントロールを含むパネルがTagプロパティ内のオブジェクトに設定されます。最後に、ユーザーがダイアログで [OK] をクリックすると、ツリー ノードをループし、Tagプロパティを取得してメソッドを呼び出しますSave

更新: 別のオプションは、プロパティ グリッド コントロールを使用することです。「きれいな」UI の外観はありませんが、非常に機能的で、カテゴリ属性によるグループ化が既にサポートされており、非常に柔軟です。すべてのオプションを表示する単一のプロパティ グリッドを使用するか、おそらくタイプに基づいて、主要な機能 (プラグイン、機能など) ごとにグループ化されたツリー ビューを使用する "ハイブリッド" アプローチを使用できます。ユーザーがそのノードをクリックすると、プロパティ グリッドにオブジェクト インスタンスが与えられます。このアプローチの唯一の欠点は、プロパティ グリッド値が変更されると、基になるプロパティがすぐに変更されるという点で "ライブ" であり、"キャンセル" の概念がないことです。

于 2009-10-10T13:12:59.323 に答える
1

そのようなコントロールが存在するかどうかはわかりませんが、必要なリフレクション コードを書くことはそれほど難しくありません。たとえば、次のようなものです。

// the class for which to create an UI
public class MyClass
{
    public string Text { get; set; }
    public int ID { get; set; }
}

...

// basic reflection code to build the UI for an object
var obj = new MyClass() { Text="some text", ID=3};

foreach (var pi in obj.GetType().GetProperties())
{
    var name = pi.Name;
    var type = pi.PropertyType;
    var value = pi.GetValue(obj, null);

    //now setup the UI control for this property and display the value
}
于 2009-10-10T13:14:58.397 に答える
1

これに似たものを偶然見つけました。少し前にこの問題があったことを思い出し、共有する必要があると思いました。

簡単な例を次に示します: http://blog.denouter.net/2008/08/simple-reflection-form.html。リフレクションを使用して、オブジェクトのプロパティに基づいていくつかのコントロールを作成します。

于 2010-09-09T07:43:32.967 に答える