2012-04-22 11 views
1

PropertyGridでカスタム動的クラスオブジェクトを使用しています(ここに投稿するにはコードが多すぎます)。簡単に言えば、任意の入力からランタイムにプロパティを作成することができます(この場合はXMLですが、それはその点です)。これらのプロパティは、別のカスタムクラスを含む任意のタイプであるため、無期限にネストすることができます。CollectionEditorを完全に無効にします

私が抱えている問題は、PropertyGridがこのクラスをCollectionとして見て、CollectionEditorを開くことができるValue列のボタンがあることです。これには、他にもAddボタンとRemoveボタンがあり、どちらも基本的にカスタムクラスを破壊します。この2つの複雑なシステムをうまく連携させるのではなく、単にCollectionEditorを完全に無効にしたいと思っています。私は(PropertyGrid.SelectedObjectを子オブジェクトに設定することによって)クラスの子オブジェクトを見ることができる別のシステムを持っています。私は、ユーザーがCollectionEditorを見るオプションを持っていなくても、このシステムとは全く互換性がないように思えます。

理想的には、私はクリックイベントをキャプチャして自分自身を処理することができるボタンを[値]列に配置したいと思いますが、これはオプションです。また、問題の行だけ、またはPropertyGrid全体のCollectionEditorを無効にしても問題ありません。私はそれをどちらの方法でも使用していないので、アクセスできないものだけが良いものになります。

答えて

1

独自のCollectionEditorの派生を試しましたか?そこにはフォームが表示されないようにいくつかのメソッド/イベントをオーバーライドして何もせずにリターンしましたか?

あなたは、その後で、あなたのコレクション型のプロパティをマークする必要があります:PropertyGridの中にマークされたコレクション・プロパティの「...」ボタンをクリックしたときにこれが自動的にMyCollectionEditorを起動します

[EditorAttribute(typeof(MyCollectionEditor), typeof(System.Drawing.Design.UITypeEditor))] 

PropertyDescriptorを継承し、GetEditorメソッドをオーバーライドして独自のCollectionEditorを返す必要がある場合もあります。

+0

どのように動作するのかわかりません - 私はCollectionEditorの外観を担当していません。私のコードのどこにでも参照されていません。 (もしそうだったら、私はこの問題を抱えませんでした。私はそれをまったく表示しないようにしていました)PropertyGridのデフォルトの動作をハイジャックして、組み込みのものではなく独自のCollectionEditorを使用する方法を教えてください。 –

+0

System.ComponentModel.Design.CollectionEditorから独自の "MyCollectionEditor"を継承し、[EditorAttribute(typeof(MyCollectionEditor)、typeof(System.Drawing.Design.UITypeEditor))])を使用してコレクションタイププロパティをマークします。 – Peladao

+0

Hmm - 行く方向。しかし、このクラスが実行時に動的に作成されるという事実はすべてを複雑にします。属性を持たないためプロパティに属性を入れることはできません。これは、PropertyDescriptorsの複雑なネストを使い、GetProperties()をオーバーライドして独自のリストを作成しているので、そのようなデコレータタグを追加するだけでは簡単にはできません。とにかく、これをもう一度やり直す前にもう一週間かかります。私は今、プロジェクトの他の部分にいます。私はあなたにそれがどのように起こるかを知らせます。 –

関連する問題