プロパティを持つコンポーネントがありList<T>
ます。リスト内のクラスには、説明属性で装飾された各プロパティがありますが、説明はコレクション エディターに表示されません。
IDE デザイナで、標準のコレクション エディタの [説明] パネルをオンにする方法はありますか? これを実現するには、CollectionEditor から独自のタイプ エディターを継承する必要がありますか?
プロパティを持つコンポーネントがありList<T>
ます。リスト内のクラスには、説明属性で装飾された各プロパティがありますが、説明はコレクション エディターに表示されません。
IDE デザイナで、標準のコレクション エディタの [説明] パネルをオンにする方法はありますか? これを実現するには、CollectionEditor から独自のタイプ エディターを継承する必要がありますか?
基本的に、独自のエディターを作成するか、サブクラスCollectionEditor
化してフォームをいじる必要があります。後者の方が簡単ですが、必ずしも美しいとは限りません...
以下は、通常のコレクション エディター フォームを使用しますが、単純にPropertyGrid
コントロールをスキャンして、 HelpVisible
.
/// <summary>
/// Allows the description pane of the PropertyGrid to be shown when editing a collection of items within a PropertyGrid.
/// </summary>
class DescriptiveCollectionEditor : CollectionEditor
{
public DescriptiveCollectionEditor(Type type) : base(type) { }
protected override CollectionForm CreateCollectionForm()
{
CollectionForm form = base.CreateCollectionForm();
form.Shown += delegate
{
ShowDescription(form);
};
return form;
}
static void ShowDescription(Control control)
{
PropertyGrid grid = control as PropertyGrid;
if (grid != null) grid.HelpVisible = true;
foreach (Control child in control.Controls)
{
ShowDescription(child);
}
}
}
これを使用中に表示するには ( の使用に注意してくださいEditorAttribute
):
class Foo {
public string Name { get; set; }
public Foo() { Bars = new List<Bar>(); }
[Editor(typeof(DescriptiveCollectionEditor), typeof(UITypeEditor))]
public List<Bar> Bars { get; private set; }
}
class Bar {
[Description("A b c")]
public string Abc { get; set; }
[Description("D e f")]
public string Def{ get; set; }
}
static class Program {
[STAThread]
static void Main() {
Application.EnableVisualStyles();
Application.Run(new Form {
Controls = {
new PropertyGrid {
Dock = DockStyle.Fill,
SelectedObject = new Foo()
}
}
});
}
}